WebClient.DownloadFileAsync真的这么慢吗?

8
我正在使用WebClientDownloadFileAsync方法从服务器下载一些文件。在VS2010中进行非正式测试时,我发现它在启动时会阻塞约3秒钟,这在我看来有点失去了初衷。
以下是相关的代码片段:
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

我正在使用DownloadFileAsync方法来下载一个大约100MB的文件,以避免UI被阻塞。显然,如果在调用开始时UI被阻塞了3秒钟,那么这种方法的效用会大大降低,甚至完全失效。
我对C#/.Net相对不太熟悉(我大约3-4年前做过一些.Net 2.0的东西,但现在基本上是重新学习)。
4个回答

9
除了Nav所说的之外,看起来问题是"网络代理自动检测",请参考此答案:为什么这个 WebRequest 代码很慢? 我测试了一下,现在第一次调用没有任何明显的延迟。

谢谢,那个完美地解决了!对于遇到同样问题的人,只需在调用下载之前将webclient的“Proxy”属性设置为null即可。 - Zoey

8
我在某个地方读到,DownloadFileAsync实际上在阻塞线程中检查DNS名称,这就是为什么你可能会遇到减速的原因。如果直接输入IP,则不应该有阻塞。在此处找到了这一信息:http://www.csharp-examples.net/download-files/

0

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

此外,如果这是一个大型应用程序的一部分,那么由于启动成本的原因,第一次总是会很慢。如果你真的想得到一个好的测量结果,请测量第一次调用所需的总时间以及第2到第10次调用所需的时间。从这个结果中,你可以找出延迟是在启动成本还是每次操作中。


-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接