c# - C# - 使用 ThreadPool 多次调用 Webclient.DownloadFileAsync
问题描述
嗨,我是多线程的新手,我正在努力使用 DownloadFileAsync 从 Web 下载多个文件。大约有 400 个文件要下载,我准备了使用 WebClient 类发送请求的 URL。我使用线程池调用了 DownloadfileAsync,希望它比串行下载更快。我使用的 URL 看起来像这样,每个 url(104、105 等)的项目编号都发生了变化。
我的代码如下所示:
foreach(var d in infolist)
{
string itemtype = d.Key;
Dictionary<string, string> folderAndurl = d.Value;
foreach (var itemcode in itemcodes)
{
foreach (var date in dates)
{
filename = folderAndurl["folder"] + date + "_" + itemcode + ".xls";
url = folderAndurl["url"].Replace("XXX", itemcode).Replace("STDATE", date);
ThreadPool.UnsafeQueueUserWorkItem(new WaitCallback(DownloadWebAsync), new object[] { filename, url });
//ThreadPool.QueueUserWorkItem(new WaitCallback(DownloadWebAsync), new object[] { filename, url });
}
}
}
和 DownloadWebAsync 如下: private void DownloadWebAsync(object state) { object[] list = state as object[]; 字符串文件名 = Convert.ToString(list[0]); 字符串 url = Convert.ToString(list 1 );
WebClient client = new WebClient();
Uri uri = new Uri(url);
client.DownloadFileCompleted += new AsyncCompletedEventHandler(Client_DownloadFileCompleted);
client.QueryString.Add("file", filename);
client.QueryString.Add("url", url);
client.DownloadFileAsync(uri, filename);
//throw new NotImplementedException();
}
当 ThreadPool 启动时,我可以看到多个BLANK文件立即在磁盘上创建,如下图所示。它们的大小都为 0 KB,我假设 ThreadPool 中的所有线程都在运行并将请求发送到网站。
但是,在我看来,磁盘上的文件是使用从请求 1 一次或最多 2 个返回的下载数据更新的(一次大多是 1 个)。我的期望是对这些 0KB 文件同时进行更新- 由于调用 DownloadFileAsync 的线程已经在运行,因此至少应该同时处理 3 或 4 个文件?我不知道我在这里的代码是否做错了什么或需要设置任何属性。我的期望是同时下载以缩短下载时间,但现在还没有发生。
我使用treadpool 的另一个原因是我正在将状态/url/下载大小写回UI 窗口,并且我不希望UI 在400 个文件下载期间无响应。
我还在使用 Thread、TreadPool、Task Parallel Library 进行测试,还使用了 Webclient、HttpClient(async/await) 等,但在所有情况下,似乎在线程或任务启动后它会立即创建空白文件 - 但实际下载一次发生。还使用 WebClient.DownloadFile 进行了测试,并且通过线程池运行时发生超时错误,因此我将不得不使用异步。
有人可以帮我解释这是否是预期的行为,或者我该如何改善下载体验?我已经为此苦苦挣扎了将近一周,非常感谢您的帮助。
问候
解决方案
推荐阅读
- sql - Oracle SQL:比较日期范围并获取同一天的日期
- ios - 当应用程序崩溃时,该时间设备未连接到 xcode。那么如何查看崩溃日志呢?
- regex - 如何在正则表达式中匹配两个新行(\ n)而不是一个?
- ios - 获取 iOS 的活跃用户数
- python - Numpy reshape 似乎输出值错误
- ios - 无法在离子中从 XLSX 生成 excel 文件
- sql-server - 当我们重新构建或重新组织索引时,是聚集索引还是非聚集索引?
- java - 无法在 Groovy gradle 项目中找到或加载主类
- c++ - 使用 reverse_iterator 而不是 const_reverse_iterator 并获得令人讨厌的编译器警告和错误
- ios - 如何检测有很多部分的 tableview 底部?(迅速)