我有一个带有进度条的对话框。当显示对话框时,后台工作者应使用WebClient下载两个文件并自动将它们复制到指定位置。
如何在复制新文件之前等待文件下载完成?
我已尝试过使用await
,但我无法将Backgroundworker更改为异步方法。如何在worker中等待下载完成?
运行worker的代码:
private void fmUpdateingDatabaseDialog_Shown(object sender, EventArgs e)
{
device.Connect();
lbInformation.Text = "uploading database to " + device.FriendlyName;
device.Disconnect();
worker.WorkerReportsProgress = true;
worker.WorkerSupportsCancellation = true;
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
worker.ProgressChanged +=
new ProgressChangedEventHandler(worker_ProgressChanged);
worker.RunWorkerCompleted +=
new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
worker.RunWorkerAsync();
}
在DoWork处理程序中编写代码(在实际代码中路径不为空):
private void worker_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
//download files temporary
WebClient client = new WebClient();
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client_DownloadProgressChanged);
client.DownloadFileTaskAsync(new Uri(""), Path.Combine(tempPath + ""));
WebClient client2 = new WebClient();
client2.DownloadProgressChanged += new DownloadProgressChangedEventHandler(client2_DownloadProgressChanged);
client2.DownloadFileTaskAsync(new Uri(""), Path.Combine(tempPath + ""));
//upload files to phone
device.Connect();
device.TransferContentToDevice(Path.Combine(tempPath+""), folder.Id, folder, true);
device.TransferContentToDevice(Path.Combine(tempPath+""), folder.Id, folder, true);
device.Disconnect();
}
await
。由于fmUpdateingDatabaseDialog_Shown
不是异步的,我不知道如何实现这个。 编辑:我不想使用同步的WebClient,因为看到进度很重要。 - j0h4nn3sasync void
的看法是什么? 我读过一篇文章指出应该避免使用它,而我在 Stack Overflow 上经常看到您回答很多与 Task 相关的问题 :) 我觉得您的意见可能非常有趣。 - defaultasync void
。async void
只应用于事件处理程序(或逻辑上为事件处理程序的事物,例如ICommand.Execute
)。在这种情况下,fmUpdateingDatabaseDialog_Shown
是一个事件处理程序,因此async void
是可接受的。DownloadAsync
不是事件处理程序,所以对于该方法使用async void
是不正确的。我有一篇文章详细讲解了这个问题。 - Stephen Cleary