我正在编写一个向天蓝色表发送查询的工具,查询量取决于用户。 我想并行发送查询,但最多只能发送给定数量(我不想一次发送所有 100 个查询)。 是否有任何内置机制可以让我每次并行发送最多 20 个查询?
我知道有 Parallel.Foreach 可以使用 ParallelOptions.MaxDegreeOfParallelism 进行限制 但对于像我这样的异步操作,这只会非常快地发送所有查询,并且我的工具将一次处理所有 100 个回调。
您应该使用
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();
}