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";