【问题标题】:DownloadFile vs DownloadFileAsync下载文件与下载文件异步
【发布时间】:2014-01-09 00:00:30
【问题描述】:

我正在使用 WebClient.DownloadFile 从 Web 服务器一次下载一个文件,但是,我想知道“线程被阻止”开发人员是否意味着应用程序不会响应?

我尝试使用 WebClient.DownloadFileAsync,但它不像 DownloadFile 那样工作,请澄清,我不知道,因为我是从网络下载文件,所以它几乎可以立即下载,提前致谢。

PS:是的,我尝试了谷歌搜索和阅读,找不到我需要的答案。

【问题讨论】:

标签: c# visual-studio-2010 networking webclient


【解决方案1】:

编辑:WebClient.DownloadFileAsync 以“Async”结尾,但不返回任务。它是Event-based Asynchronous Pattern 的一部分,所以我的回答不相关。这一项是:您需要订阅WebClient.DownloadFileCompleted 事件才能知道异步操作何时完成。例如:

var client = new WebClient();
var uri = new Uri(address);

client.DownloadFileCompleted += (sender, e) => Console.WriteLine("Finished");
client.DownloadFileAsync(uri, "Hamsters.txt");

原答案: WebClient.DownloadFileAsync 返回您需要等待的任务。像这样:

await WebClient.DownloadFileAsync(...)

DownloadFileAsync 触发一个异步操作并返回一个任务,该任务将在操作结束时完成。 await 表示等待该任务以异步方式结束,因此当您获得 DownloadFileAsync 的结果时,它将运行它之后的代码。

同步的DownloadFile 会阻塞调用它的线程。如果它是 UI 线程,那么是的……您的应用程序不会响应。如果它不是 UI 线程,那么它仍然是响应式的,但它的可扩展性会降低(这意味着它使用线程等待而不是工作,所以你的应用程序作为一个整体可以用相同数量的线程做更少的事情)

【讨论】:

  • 我明白了,我正好用的是VS 2010,貌似不支持await,有没有其他的选择?
  • 是的。一些。您可以使用 BCL.Async 将 async-await 与 VS 2010 一起使用。或者您可以使用ContinueWithWebClient.DownloadFileAsync(...).ContinueWith(_ => Console.WriteLine(_.Result); 注册任务的延续。
  • 非常感谢我这几天一直在寻找这个答案,我现在就试试 :)
  • @user3157365 您还可以使用异步文件下载操作完成时发生的DownloadFileCompleted 事件。
  • 您的编辑确实是相关的,我对您的代码进行了一些编辑,它就像一个魅力,再次感谢,对保持我的小应用程序运行有很大帮助:)
【解决方案2】:
client.DownloadFileTaskAsync(new Uri(url), saveLocation).Wait();
// Waiting for download...

【讨论】:

  • 或等待 client.DownloadFileTaskAsync(new Uri(url), saveLocation);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-07
  • 1970-01-01
  • 2018-07-15
  • 2013-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多