[菜鸟求助]简单的多线程问题
简单的线程问题,我想把一个大文件用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什么的同步机制。