【问题标题】:Is WebClient.DownloadFileAsync really this slow?WebClient.DownloadFileAsync 真的这么慢吗?
【发布时间】:2010-06-04 09:43:52
【问题描述】:

我正在使用WebClientDownloadFileAsync 方法从服务器下载一些文件,我不禁注意到,在我在VS2010 中对我的代码进行非正式测试时,它会阻塞大约3 秒,而它开始了,在我看来,这首先违背了目的。

这里是相关的sn-p代码:

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 来防止 UI 在应用程序下载约 100 MB 文件时阻塞。显然,如果在调用开始时 UI 阻塞 3 秒,这会在一定程度上降低实用程序,如果不是完全的话。

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

【问题讨论】:

    标签: c# performance webclient downloadfileasync


    【解决方案1】:

    除了 Nav 所说的,问题似乎是 web 代理自动检测,请参阅此答案:Why is this WebRequest code slow?

    我对其进行了测试,现在它在第一次通话期间可以正常工作。

    【讨论】:

    • 谢谢,效果很好!对于那些遇到同样问题的人,只需在调用下载之前将 webclient 的 'Proxy' 属性设置为 null。
    【解决方案2】:

    我在某处读到,DownloadFileAsync 实际上会在阻塞线程中检查 DNS 名称,因此您可能会遇到速度变慢的情况。如果直接把IP放进去,应该不会有阻塞。在此处找到该信息:http://www.csharp-examples.net/download-files/

    【讨论】:

      【解决方案3】:

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

      此外,如果这是大型应用程序的一部分,那么由于启动成本,第一次总是很慢。如果您真的想获得良好的测量结果,请测量第 1 次调用以及第 2 次到第 10 次调用所需的总时间。从这里你可以知道延迟是在启动成本上,还是每次。

      【讨论】:

        【解决方案4】:

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

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

        以下是有关它的其他信息: WebClient async callback not called in ASP.NET MVC

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-03-13
          • 2023-04-10
          • 2011-11-12
          • 2012-02-13
          • 2010-11-28
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多