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吗?