C# 如何用并行foreach实现下载队列异步
我想尝试一些类似于从一组图像下载的方法,至少3次并发下载,但是,一旦3次下载中的一次完成,就从列表中添加一次新下载,或者必须等待添加一次新下载,直到3次并发下载完成。我如何实现这样的东西 到目前为止,我已经尝试过了,但它似乎可以在不等待完成的情况下从3个并发下载中至少下载1个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
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
可能是实现异步节流的最方便的工具。