如何在使用DownloadFileAsync时阻止主线程

时间:2015-01-21 15:36:55

标签: c# multithreading

在我的项目中,我有一个下载文件的部分。我使用DownloadFileAsync()方法下载并添加两个事件处理程序:

  • DownloadProgressChanged

  • DownloadFileCompleted

我想使用DownloadFileAsync下载文件,阻止主线程,因为我不希望用户在下载完成之前点击按钮。

我的部分代码:

WebClient webClient = new WebClient();
        webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChange);
        webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
        Uri Url = new Uri(txtUrl.Text.Trim());
        webClient.DownloadFileAsync(Url,FolderDialog.SelectedPath+System.IO.Path.GetFileName(txtUrl.Text) );

我该怎么做? 我在互联网上搜索但我找不到有用的结果。感谢

3 个答案:

答案 0 :(得分:6)

禁用控件比故意阻止UI线程更好。在Windows窗体中,可以通过将Control.Enabled设置为false来完成此操作。我不熟悉WPF,所以不能说出你在那里做的事情。无论如何,禁用控件可以在不停止正常处理事件的情况下为您提供所需的行为,因此用户仍然可以移动窗口,它仍然会重新绘制,等等。

答案 1 :(得分:2)

您不需要禁用整个线程,只需禁用该按钮即可。如果你真的想要禁用主线程,只需调用thread.sleep,但这样做会使下载异步的目的失败,因为最终结果与正常下载相同。

答案 2 :(得分:0)

正如其他人所说,根据我的经验,这样做的一般方法是:

  1. 在进行任何下载之前,禁用了
  2. 下载开始。
  3. 下载完成事件处理程序再次启用该按钮。
  4. 此外,如果出现问题,应启用该按钮。