真正的并行下载

这种方法我用于并发下载

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将开始下载数据,而不是像所有将开始进展下载。

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

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

Solutions Collecting From Web of "真正的并行下载"

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); string result = client.DownloadString(u); Console.WriteLine("finished downloading {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; }