如何限制Parallel.foreach进行异步操作?

时间:2014-01-12 15:35:41

标签: c# .net asynchronous parallel.foreach

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

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

1 个答案:

答案 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();
}