C# 如何用并行foreach实现下载队列异步

C# 如何用并行foreach实现下载队列异步,c#,async-await,concurrent-processing,C#,Async Await,Concurrent Processing,我想尝试一些类似于从一组图像下载的方法,至少3次并发下载,但是,一旦3次下载中的一次完成,就从列表中添加一次新下载,或者必须等待添加一次新下载,直到3次并发下载完成。我如何实现这样的东西 到目前为止,我已经尝试过了,但它似乎可以在不等待完成的情况下从3个并发下载中至少下载1个 List<string> listOfLink = new List<string>(); await Task.Run(() => Parallel.ForEach(lis

我想尝试一些类似于从一组图像下载的方法,至少3次并发下载,但是,一旦3次下载中的一次完成,就从列表中添加一次新下载,或者必须等待添加一次新下载,直到3次并发下载完成。我如何实现这样的东西

到目前为止,我已经尝试过了,但它似乎可以在不等待完成的情况下从3个并发下载中至少下载1个

List<string> listOfLink = new List<string>();

await Task.Run(() =>
        Parallel.ForEach(listOfLink, new ParallelOptions { MaxDegreeOfParallelism = 3 }, async (link, state, index) => 
        {
          //Download image httpclient
          //DownloadImageAsync(link);
        }));
List listOfLink=new List();
等待任务。运行(()=>
ForEach(listOfLink,新的ParallelOptions{MaxDegreeOfParallelism=3},异步(链接、状态、索引)=>
{
//下载图像httpclient
//下载ImageAsync(链接);
}));

我不完全确定您是否需要并行使用
。对于此处的ForEach
,这个答案可以解释为什么在此处重新编写它比我更好:

然而,为了回答您的实际问题,我建议您:

var listOfLink=new List();
var downloadTasks=listOfLink.Select(link=>DownloadImageAsync(link));
等待任务。WhenAll(下载任务);

我不完全确定您是否需要并行使用
。对于此处的ForEach
,这个答案可以解释为什么在此处重新编写它比我更好:

然而,为了回答您的实际问题,我建议您:

var listOfLink=new List();
var downloadTasks=listOfLink.Select(link=>DownloadImageAsync(link));
等待任务。WhenAll(下载任务);

谢谢你的任务。何时下载所有?或者您可以设置每个任务的最小下载量?等待
任务。WhenAll()
调用将等待所有任务完成。哇,谢谢这正是我需要的。我认为最好不要使用
Parallel。对于这种情况,我会尝试使用
Parallel,但我会尝试。@ropenrom24如果您想限制并发下载的数量,只需尝试
var-semaphore=new-SemaphoreSlim(3);var downloadTasks=listOfLink.Select(异步链接=>{await semaphore.WaitAsync();尝试{return await downloadtimageasync(link);}最后{semaphore.Release();})。感谢Task.WhenAll()下载所有内容吗?或者您可以设置每个任务的最小下载量?等待
任务。WhenAll()
调用将等待所有任务完成。哇,谢谢这正是我需要的。我认为最好不要使用
Parallel。对于这种情况,我会尝试使用
Parallel,但我会尝试。@ropenrom24如果您想限制并发下载的数量,只需尝试
var-semaphore=new-SemaphoreSlim(3);var downloadTasks=listOfLink.Select(异步链接=>{await semaphore.WaitAsync();尝试{return await downloadtimageasync(link);}最后{semaphore.Release();})
并行
类不支持异步。要限制并发异步I/O操作的数量,请参见。
SemaphoreSlim
可能是实现异步节流的最方便的工具。
Parallel
类不是异步友好的。要限制并发异步I/O操作的数量,请参见。
信号量lim
可能是实现异步节流的最方便的工具。