8

我正在使用从服务器下载一些文件的DownloadFileAsync方法WebClient,我不禁注意到,在我在 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

当应用程序下载约 100 MB 的文件时,我DownloadFileAsync用来防止 UI 阻塞。显然,如果在呼叫开始时 UI 阻塞 3 秒,这会在一定程度上减少实用程序,如果不是完全的话。

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

4

4 回答 4

9

除了 Nav 所说的,看起来问题是网络代理自动检测,请参阅这个答案:为什么这个 WebRequest 代码很慢?

我对其进行了测试,现在它在第一次通话期间可以正常工作,没有任何明显的延迟。

于 2010-09-26T18:47:25.217 回答
8

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

于 2010-06-25T02:12:52.437 回答
0

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

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

于 2010-06-17T01:12:46.830 回答
-1

在 ASP.NET 中,如果 async 方法期望线程角色,则使用 async 方法没有任何意义。
当我启动 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

于 2011-08-28T09:58:49.207 回答