如何限制Parallel.foreach进行异步操作? [重复]

问题描述 投票:0回答:1

我正在编写一个向天蓝色表发送查询的工具,查询量取决于用户。 我想并行发送查询,但最多只能发送给定数量(我不想一次发送所有 100 个查询)。 是否有任何内置机制可以让我每次并行发送最多 20 个查询?

我知道有 Parallel.Foreach 可以使用 ParallelOptions.MaxDegreeOfParallelism 进行限制 但对于像我这样的异步操作,这只会非常快地发送所有查询,并且我的工具将一次处理所有 100 个回调。

c# .net asynchronous parallel.foreach
1个回答
4
投票

您应该使用

SemaphoreSlim
。它在异步操作的情况下特别好,因为它有
WaitAsync
返回一个您可以
await
执行的任务。前 20 个将直接执行,其余的将异步等待操作结束,以便它们可以开始。

SemaphoreSlim _semaphore = new SemaphoreSlim(20);

async Task DoSomethingAsync()
{
    await _semaphore.WaitAsync();
    try
    {
        // possibly async operations limited to 20
    }
    finally
    {
        _semaphore.Release();
    }
}

用途:

for(int i=0; i < 100; i++)
{
    await DoSomethingAsync();
}
© www.soinside.com 2019 - 2024. All rights reserved.