【发布时间】:2014-01-28 08:06:48
【问题描述】:
我们正在编写一个小工具,用于从我们的网络服务器下载文件并对其进行分析。文件很多,下载大约需要 10 分钟,我们希望通过允许应用并行下载文件来缩短下载时间。
目前我们有一个循环遍历要下载的文件列表,只需下载它们并将文件名添加到分隔字符串中:
foreach (var File in ServerFiles)
{
string sFileName = File.Uri.LocalPath.ToString();
// some internal logic and initialization
oBlob.DownloadToStream(fileStream);
sFiles += sFileName.Replace("/" + Container + "/", "") + ",";
}
我们已将其更改为:
foreach (var File in ServerFiles)
{
string sFileName = File.Uri.LocalPath.ToString();
// some internal logic and initialization
Task downloadTask = oBlob.DownloadToStreamAsync(fileStream);
sFiles += sFileName.Replace("/" + Container + "/", "") + ",";
}
现在我的问题是如何处理我返回的任务。如果我只是调用 downloadTask.wait() 那么它会像以前一样离开它。
我考虑过使用 continueWith - 但是在该块内应该做什么?它如何知道所有其他文件都已完成下载?
我什至考虑将任务存储在一个集合中,并在 foreach 循环结束时编写另一个循环来接收所有任务并调用它们的 wait 方法。
解决此类问题的正确方法是什么?
【问题讨论】:
-
您确定并行下载它们会更快吗?你发现瓶颈了吗?源磁盘、网络、目标磁盘?并行性如何改善瓶颈?
-
如果所有文件确实在同一台服务器上,还需要增加
ServicePointManager.DefaultConnectionLimit。
标签: c# .net task-parallel-library