Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何限制异步操作的Parallel.foreach?_C#_.net_Asynchronous_Parallel.foreach - Fatal编程技术网

C# 如何限制异步操作的Parallel.foreach?

C# 如何限制异步操作的Parallel.foreach?,c#,.net,asynchronous,parallel.foreach,C#,.net,Asynchronous,Parallel.foreach,我正在编写一个向azure表发送查询的工具,查询量取决于用户。 我希望并行发送查询,但最多只能发送给定数量的查询(我不希望一次发送所有100个查询)。 是否有任何内置机制,我可以用来发送,比如说,每次最多并行发送20个查询 我知道存在Parallel.Foreach,可以使用ParallelOptions.MaxDegreeOfParallelism对其进行限制 但是对于像我这样的异步操作,这将非常快速地发送所有查询,我的工具将一次处理所有100个回调。您应该使用信号量lim。在异步操作的情况下

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

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

您应该使用
信号量lim
。在异步操作的情况下,它特别好,因为它有
WaitAsync
,返回一个您可以
wait
打开的任务。前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();
}
for(int i=0;i<100;i++)
{
等待DoSomethingAsync();
}

为什么限制MaxDegreeOfParallelism对您不起作用?为什么要缓冲请求?您确定服务无法处理所有请求吗?您如何使用该服务?通常,框架为您提供了内置的机制来处理异步I/O