C# 具有受控并行性和AwaitAll选项的异步任务
我有一个场景,其中来自我的应用程序的不同代码可以调用以下方法C# 具有受控并行性和AwaitAll选项的异步任务,c#,async-await,task,C#,Async Await,Task,我有一个场景,其中来自我的应用程序的不同代码可以调用以下方法 async Task downloadFile(string fileName) { await downloadService(fileName); } 需要一个机制,我可以控制它可以发送的最大请求数。例如,在5个活动请求之后,我希望其余的请求排队,并且只有在我们从现有请求之一获得响应后,下一个请求才会启动。我还需要一种机制,在这种机制中,我可以侦听代码中的所有活动/排队请求,比如Task.WhenAll 我最感兴趣的是一
async Task downloadFile(string fileName)
{
await downloadService(fileName);
}
需要一个机制,我可以控制它可以发送的最大请求数。例如,在5个活动请求之后,我希望其余的请求排队,并且只有在我们从现有请求之一获得响应后,下一个请求才会启动。我还需要一种机制,在这种机制中,我可以侦听代码中的所有活动/排队请求,比如Task.WhenAll
我最感兴趣的是一个内置的.Net库。我知道,但似乎我必须自己实现大部分的入/出队列功能。正在考虑是否存在更合适的库。您可以按如下方式尝试该类:
SemaphoreSlim semaphore = new SemaphoreSlim(5, 5);
async Task downloadFile(string fileName)
{
await semaphore.WaitAsync();
try
{
await downloadService(fileName);
}
finally
{
semaphore.Release();
}
}
如果排队的任务数量预计不会很大,那么如果其他人建议使用
SemaphoreSlim
。如果预期队列会变长,或者如果您不断生成新任务,并且需要能够限制生产者,那么您需要考虑使用TPL数据流或使用您自己的机制来支持限制最大并行度(这不是特别容易).对于将在很短时间内完成的任务,不建议使用信号量LIM吗?