同时执行4个任务,每个任务完成时自动启动另一个任务

Ami*_*rge 2 c# async-await

我有100个网址列表.我需要获取这些网址的html内容.假设我不使用异步版本,DownloadString而是执行以下操作.

var task1 = SyTask.Factory.StartNew(() => new WebClient().DownloadString("url1"));
Run Code Online (Sandbox Code Playgroud)

我想要实现的是一次获取最多4个URL的html字符串.

我为前四个网址启动了4个任务.假设第二个网址完成,我想立即启动第五个网址的第5个任务.等等.这种方式最多只能下载4个网址,并且出于所有目的,总会有4个网址被下载,即直到所有100个网址都被处理完毕.

我似乎无法想象我将如何实现这一目标.这样做必须有既定的模式.思考?

编辑:

关注@ Damien_The_Unbeliever的评论使用Parallel.ForEach,我写了以下内容

var urls = new List<string>();
var results = new Dictionary<string, string>();
var lockObj = new object();
Parallel.ForEach(urls,
                 new ParallelOptions { MaxDegreeOfParallelism = 4 },
                 url =>
                 {
                     var str = new WebClient().DownloadString(url);
                     lock (lockObj)
                     {
                         results[url] = str;
                     }
                 });
Run Code Online (Sandbox Code Playgroud)

我认为上述内容比创建单个任务和使用信号量限制并发更好.那说从未使用或使用过Parallel.ForEach,我不确定这是否正确地做了我需要做的事情.

I4V*_*I4V 8

SemaphoreSlim sem = new SemaphoreSlim(4);
foreach (var url in urls)
{
    sem.Wait();
    Task.Factory.StartNew(() => new WebClient().DownloadString(url))
         .ContinueWith(t => sem.Release());    
}
Run Code Online (Sandbox Code Playgroud)