微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

真正的并行下载

这种方法我用于并发下载。

public void DownloadConcurrent(Action Method) { Action[] methodList = new Action[Concurent_Downloads]; for (int i = 0; i < Concurent_Downloads; i++) { methodList[i] = Method; } Parallel.Invoke(methodList); }

我正在尝试同时下载url,但是活动下载的数量总是一个

像所有的下载将调用,但只有一个url将开始下载数据,而不是像所有将开始进展下载。

我希望所有下载能够同时并行工作,无法实现。

Windows VB.NET 1.1升级到2.0 – 好处?

托pipe代码(特别是.NET)是否可以成为“非托pipe”?

使用来自C#/。NET的GDAL的“No disk”错误

我在哪里可以findsql Server版本的友好的string?

Windows服务无法正常工作时,exe文件转换为服务

更新:方法是使用队列,它是下载不同的URL,形成队列。

我如何获得当前.exe的散列?

与Windows命名pipe道(.Net)的asynchronous双向通信

如果打开DDE频道的应用程序崩溃,会发生什么情况?

作为另一个用户启动Windows进程,而不直接知道密码

Windows 8是否支持System.Device.Location?

WebClient的实例成员不是线程安全的,因此请确保在每个操作中都有单独的实例。 在你已经显示方法中,你好像多次乘以相同的动作委托。 所以你不下载不同的网址,你是多次下载相同的网址。 而且因为WebClient不是线程安全的,你可能会遇到问题。

以下是使用TPL并行下载多个URL的示例:

using System; using System.Linq; using System.Net; using System.Threading.Tasks; class Program { static void Main() { var urls = new[] { "http://google.com","http://yahoo.com","http://stackoverflow.com" }; var tasks = urls .Select(url => Task.Factory.StartNew( state => { using (var client = new WebClient()) { var u = (string)state; Console.WriteLine("starting to download {0}",u); string result = client.DownloadString(u); Console.WriteLine("finished downloading {0}",u); } },url) ) .ToArray(); Task.WaitAll(tasks); } }

为了改进@ Darin-Dimitrov的答案,你可以从client.DownloadString()检索result ,以在使用这个改进函数的另一个地方使用:

public List<string> DownloadUrlsInParallel(Uri[] urls) { var tasks = urls .Select(url => Task.Factory.StartNew( state => { using (var client = new System.Net.WebClient()) { var u = (Uri)state; Console.WriteLine("starting to download {0}",u); return result; } },url) ) .ToArray(); Task.WaitAll(tasks); List<string> ret = new List(); foreach(var t in tasks) { ret.Add(t.Result); } return ret; }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐