其实任务已经完成了一半,我有现成的解决方案,不是没有帮助backgoundWorker:
复制功能:
private void copy_file(string source_, string des)
{
FileStream fsOut = new FileStream(des, FileMode.Create);
FileStream fsIn = new FileStream(source_, FileMode.Open);
byte[] bt = new byte[1048756];
int readByte;
while ((readByte = fsIn.Read(bt, 0, bt.Length)) > 0)
{
fsOut.Write(bt, 0, readByte);
backgroundWorker1.ReportProgress((int)(fsIn.Position * 100 / fsIn.Length));
}
fsIn.Close();
fsOut.Close();
}
做工作:
private void Worker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{
copy_file(server_path + filename, Environment.GetFolderPath(Environment.SpecialFolder.Desktop) + "\\" + filename);
}
RunWorker 已完成:
private void Worker_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{
if (e.Error == null)
{
err_msg.Text = "Файл находится на рабочем столе!";
}
else
{
err_msg.Text = "Произошла ошибка.";
}
download_sound.Enabled = true;
}
进度改变:
private void Worker_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
err_msg.Text = progressBar1.Value.ToString() + "%";
}
点击按钮:
Worker.RunWorkerAsync();
上面的方法效果很好,但是当在异步函数中使用这个方法时(比如private async void button_click()
),我得到了一个线程排队的效果,嗯......文件被复制 - 放在正确的文件夹中 - 进度条立即填满。我试图通过网络复制,同样的麻烦。但幸运的是,当async
你btn
外出时它可以工作。
现在说重点:
因为 最初,我的计划是使用async\await
方法,我切换到这种文件复制:
public async Task CopyFilesAsync(StreamReader Source, StreamWriter Destination)
{
char[] buffer = new char[0x1000];
int numRead;
while ((numRead = await Source.ReadAsync(buffer, 0, buffer.Length)) != 0)
{
await Destination.WriteAsync(buffer, 0, numRead);
}
}
_
public async Task CopyFile(string startDirectoy, string endDirectory)
{
using (StreamReader SourceReader = File.OpenText(startDirectoy))
{
using (StreamWriter DestinationWriter = File.CreateText(endDirectory))
{
await CopyFilesAsync(SourceReader, DestinationWriter);
SourceReader.Close();
DestinationWriter.Close();
}
}
}
我只是不知道如何让progressBar 执行我的任务。我也无法到达 StreamReader.Position 使用:
progressBar1.Value=(int)((StreamReader.BaseStream.Position/StreamReader.BaseStream.Length)*100);
我没有成功。ProgressBar 与一切分开为我工作>< 如果您有一些提示,请给他们,我将非常感激!
我有一个下载文件的例子,为什么不重写它来复制
button1
- 复制按钮,button2
- 取消按钮,progressBar1
- 进度条考虑到winform进度条的慢动画来更新进度
@PavelMayorov 关于立即开始在线程池中复制的建议可以这样实现