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