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