WebClient.DownloadFileAsync真的这么慢吗?

时间:2010-06-04 09:43:53

标签: c# performance webclient downloadfileasync

我正在使用DownloadFileAsync的{​​{1}}方法从服务器下载一些文件,我不禁注意到在VS2010中对我的代码的非正式测试中,它阻止了它开始的时候大约3秒钟,在我看来,这首先打败了目的。

以下是相关的代码片段:

WebClient

我正在使用WebClient downloader = new WebClient(); downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(updateDownloadProgress); downloader.DownloadFileCompleted += new System.ComponentModel.AsyncCompletedEventHandler(downloadCompleted); var current_map = map_downloads[0];//string with filename, map_downloads is List<string> var path = System.IO.Path.GetTempFileName(); downloaded_maps.Add(path);//adding the temp file to a List<string> downloader.DownloadFileAsync(new Uri(MAP_BASE + current_map), path); //MAP_BASE is a string containing the base url 在应用程序下载~100 MB文件时阻止UI阻止。显然,如果UI在呼叫开始时阻塞了3秒,那么即使不完全也会在某种程度上减少效用。

我对C#/ .Net相对缺乏经验(大约3 - 4年前我做过一堆.Net 2.0的东西,IIRC,但我现在基本上重新学习了。)

4 个答案:

答案 0 :(得分:8)

除了Nav所说的,看起来问题是网络代理自动检测,请参阅此答案:Why is this WebRequest code slow?

我对它进行了测试,现在它在第一次通话时没有任何明显的延迟。

答案 1 :(得分:7)

我在某处读到了DownloadFileAsync实际上在阻塞线程中检查DNS名称,因此您可能会遇到减速的原因。如果直接放入IP,则不应该阻塞。在这里找到了这条信息:http://www.csharp-examples.net/download-files/

答案 2 :(得分:0)

您是否知道延迟是在您的应用中还是在网络上?要确定目标服务器是否运行缓慢,请运行Wireshark并查看在发送请求后何时收到第一个响应。也许这就是延迟发生的地方?

此外,如果这是大型应用程序的一部分,那么由于启动成本,第一次总是会很慢。如果您真的想要获得一个好的度量,请测量第一次调用以及第二次到第十次调用所需的总时间。通过此,您可以了解延迟是在启动成本中,还是每次都是。

答案 3 :(得分:-1)

在ASP.NET中,如果从aysnc方法预期线程角色,则使用async方法没有意义。
当我启动webclient异步时,它总是在主线程完成时加入(在渲染aspx之前)。

关于该主题的

优秀文章:http://weblogs.asp.net/gunnarpeipman/archive/2010/09/07/making-asynchronous-calls-to-web-services-during-asp-net-page-processing.aspx

enter image description here

这里有关于它的其他信息: WebClient async callback not called in ASP.NET MVC