【问题标题】:How to limit Parallel.foreach for asynchronous operations?如何限制 Parallel.foreach 进行异步操作?
【发布时间】:2014-01-12 15:35:41
【问题描述】:

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

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

【问题讨论】:

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

标签: c# .net asynchronous parallel.foreach


【解决方案1】:

您应该使用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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 2023-04-06
    • 1970-01-01
    • 2019-01-31
    • 2015-02-06
    相关资源
    最近更新 更多