我有一个简单的 C# 系统托盘应用程序,它使用 System.Net.WebClient
下载多个文件,每个文件的大小在 3-15MB 之间。 WebClient 通过 HTTPS 下载,我控制下载的服务器。这些文件通过直接路径从 Web 浏览器下载得很好,并且 WebClient 完全能够从该服务器处理 .DownloadString()
方法(即,将短文本文件下载到字符串)。
奇怪的是,24 小时内发生了三件事,我怀疑某种特定于机器的配置或缓存,但我想知道其他人可能知道哪些可能允许的 WebClient
内部结构他们冒险猜测:
- 1 号开发机在 Debug模式下运行这段代码并下载文件(称它们为 MegabyteFile1 和 MegabyteFile2)直到星期五都没有问题。下载最多需要 3-5 秒。
- 周五下午,开发机器 #1 突然停止下载 MegabyteFile1。行为如下:
WebClient.DownloadFile()
无限期挂起targetFileFullPath
处的文件已创建,但有 0 个字节。- 主线程无限期阻塞。
- 必须退出应用程序。
- 具有相同操作系统配置的其他开发机器运行代码并成功下载。
- 无论是否使用查询参数,在 DevelopmentMachine1 上使用 Chrome 或 Internet Explorer 手动下载这些文件都可以正常工作。
- DevelopmentMachine1 将在 Fiddler 运行时下载该文件(即使没有安装 Fiddler HTTPS 证书冒名顶替程序)。换句话说,如果我尝试嗅探这台机器上的电线,一切正常。
下载代码的相关部分如下:
using (WebClient client2 = new WebClient())
{
client2.DownloadFile(String.Format("{0}?{1}", thePath, queryParams), targetFileFullPath);
}
我已经在这个盒子上尝试了通常的系统管理员操作:重新启动它,清除 Internet Explorer 缓存和临时目录等。
我知道我需要改变我处理挂起下载的策略,因为我确信在现实世界中会有下载挂起。但是,如果我不了解导致这种特定故障模式的原因,我不确定我会想到所有极端情况。任何人都足够了解 WebClient
中发生的事情,可以冒险猜测为什么这台机器“特别”吗?
谢谢! -詹姆斯
最佳答案
遇到同样的问题,但找到了另一种解决方案。 这里的讨论相当复杂: http://social.msdn.microsoft.com/Forums/en-US/a00dba00-5432-450b-9904-9d343c11888d/webclient-downloadstringasync-freeze-my-ui?forum=ncl
简而言之,问题是 Web 客户端正在搜索代理服务器并挂起应用程序。 以下解决方案有帮助:
WebClient webClient = new WebClient();
webClient.Proxy = null;
... Do whatever else ...
关于c# - 奇怪的 WebClient 行为 : 1 computer hangs, 其他人不对同一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18175456/