日期:2014-05-18  浏览次数:21186 次

c#实现多线程读取文件问题
我做了个读取文件的程序。但是在读取大的文件时,很慢,甚至会出现假死机的现象。有高人说要用多线程读才能避免此种情况。此外,读取的文件中有中文的时候还会读出乱码。请高人指教。最好把代码写出来。
我写的读取文件代码如下:
private void button1_Click(object sender, System.EventArgs e)
{
OpenFileDialog ofd = new OpenFileDialog();
//ofd.Filter = "文本文件(*.txt) |*.txt";
if (ofd.ShowDialog() == DialogResult.OK)
{
this.label1.Text="您导入的文件是:"+ofd.FileName;;
string str=ofd.FileName;
FileStream fs=new FileStream(str,FileMode.Open,FileAccess.Read); 
//使用StreamReader类来读取文件
StreamReader streamReader=new StreamReader(fs);
streamReader.BaseStream.Seek(0,SeekOrigin.Begin);
// 从数据流中读取每一行,直到文件的最后一行,并在richTextBox1中显示出内容 
this.richTextBox1.Text="";
string strLine=streamReader.ReadLine();
while(strLine!=null)
{
this.richTextBox1.Text+=strLine+"\n";
strLine=streamReader.ReadLine(); 
}
//关闭此StreamReader对象 
streamReader.Close(); 
}
}
小弟在此谢过各位大哥了,祝你们2008年好运!

------解决方案--------------------
public void Main() //主函数,其实应该是你的函数,这里只作表示
{
Thread tr=new Thread(new ThreadStart(ReadJob);
tr.Start();
}
public void ReadJob()
{
readout=read("c:\\a.txt");
readcallback(this, EventArgs.Empty);
}
public string read(string filepath)
{
…………//读文件代码 省略
}
protected TextBox textBox1=new TextBox1();//这行代码只是表示你的窗体上有个textBox1,具体代码不是这样的。
protected string readout="";
protected delegate void readcallback(object sender, EventArgs e);
protected void readoverwork(object sender, EventArgs e)
{
if (textBox1.InvokeRequired)// 在VS2003中允许跨线程访问UI元素,但在05中报错,所以要用到线程推送,如果你要显示结果在非UI控件中就不必如此。还可以参考MSDN的BACKGROUNDWORK类实现简单的跨线程掉用UI。
{
object[] chuan = new object[2];
chuan[0] = sender;
chuan[1] = e;
button5.Invoke(new Servernetbreakcallback(Servernetbreakwork), new object[] { chuan });
}
else
{
textBox1.Text=readout;
}
}
------解决方案--------------------
少了一句
 Thread tr=new Thread(new ThreadStart(ReadJob); 
 tr.IsBackGround=true;
 tr.Start(); 


以上是传统的线程方式,
其实对于.NET2.0来说 已经封装好了很多类来实现异步读取。大多数简单程序没必要使用自己的线程。
FileStream类提供了
BeginRead ,BeginWrite 等方法直接实现异步访问。
参考MSDN吧
------解决方案--------------------
button5.Invoke(new Servernetbreakcallback(Servernetbreakwork), new object[] { chuan }); 
一着急又写错了~ 我是拿以前的例子改的 见凉哦 哈哈.
应该是
textBox1.Invoke(new readcallback(readoverwork), chuan );
------解决方案--------------------
"此外,读取的文件中有中文的时候还会读出乱码。"


这个可以修改 StreamReader实现
如下:
StreamReader streamReader=new StreamReader(fs,System.Text.Encoding.Default); 

------解决方案--------------------
public void Main() //主函数,其实应该是你的函数,这里只作表示 

Thread tr=new Thread(new ThreadStart(ReadJob); 
tr.IsBackGround=true;
tr.Start(); 

public void ReadJob() 

readout=read("c:\\a.txt"); 
readcallback(this, EventArgs.Empty); 

public string read(string filepath) 

…………//读文件代码 省略 
OpenFileDialog ofd = new OpenFileDialog(); 
//ofd.Filter = "文本文件(*.txt) ¦*.txt";