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

[菜鸟求助]简单的多线程问题
简单的线程问题,我想把一个大文件用5个线程转移复制到另一个目录下,但是为什么最后得到的新文件只有原文件的1/5
我才开始学线程 有很多地方不是很明白 希望各位能给点提示 帮忙看下是哪里有问题` !
 byte[] buf = null;
  private void button1_Click(object sender, EventArgs e)
  {
   
  if (openFileDialog1.ShowDialog() == DialogResult.OK)
  {
   
  string path = openFileDialog1.FileName;
  label1.Text = "源路径:" + path.ToString();
  try
  {
  FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);  
  fs.Read(buf, 0, buf.Length);
  }
  catch (Exception)
  {
  }
   
  }
  }
   
  private void button2_Click(object sender, EventArgs e)
  {
  if (saveFileDialog1.ShowDialog() == DialogResult.OK)
  {
  string path1 = saveFileDialog1.FileName;
  label2.Text = "源路径:" + path1.ToString();
  Thread th1 = new Thread(method1);
  Thread th2 = new Thread(method1);
  Thread th3 = new Thread(method1);
  Thread th4 = new Thread(method1);
  Thread th5 = new Thread(method1);
  th1.Start();  
  th2.Start();  
  th3.Start();
  th4.Start();
  th5.Start();
  }
  }
  public void method1()
  {

  string path2 = openFileDialog1.FileName;
  try
  {
  FileStream fs = new FileStream(path2, FileMode.Open, FileAccess.ReadWrite,FileShare .ReadWrite);
  long leng = fs.Length/5;
  buf = new byte[leng];
   
  fs.Seek(0 , SeekOrigin.Begin);
  fs.Read(buf, 0, buf.Length);
  fs.Write(buf, 0, buf.Length);
  fs.Close();  
  }
  catch (Exception ex)
  {
  MessageBox.Show(ex.Message);
  }

  }

------解决方案--------------------
写文件是exclusive性质的操作,你也写方式打开一个文件,就不能再以写方式打开这个文件了。

不要再线程中打开 -- FileStream fs = new FileStream(path2, FileMode.Open, FileAccess.ReadWrite,FileShare .ReadWrite); 
在启动线程前创建这个对象,然后作为参数传到线程里。

另外线程中
fs.Seek(0 , SeekOrigin.Begin); 
fs.Read(buf, 0, buf.Length); 
fs.Write(buf, 0, buf.Length); 
fs.Close();

每次都从0开始写,后面的会覆盖前面的。需要每个线程负责写入的段的起始位置作为参数传给线程。

我觉得多线程写一个文件不是一个好注意,说不定
FileStream 内部会有lock什么的同步机制。