我怎样才能油门净异步功能呢?油门、功能

2023-09-04 02:38:39 作者:我在你的婚礼上唱分手快乐

我使用的是异步,等待在.NET。如何限制并发异步调用的次数?

I'm using async-await in .Net. How can I limit the number of concurrent asynchronous calls?

推荐答案

一个比较简单的方法是(AB)使用TPL数据流。是这样的:

One relatively simple way is to (ab)use TPL Dataflow. Something like:

public IEnumerable<TOutput> AsyncThrottle<TInput, TOutput>(
    IEnumerable<TInput> inputs, Func<TInput, Task<TOutput>> asyncFunction,
    int maxDegreeOfParallelism)
{
    var outputs = new ConcurrentQueue<TOutput>();

    var block = new ActionBlock<TInput>(
        async x => outputs.Enqueue(await asyncFunction(x)),
        new ExecutionDataflowBlockOptions
        { MaxDgreeOfParallelism = maxDegreeOfParallelism });

    foreach (var input in inputs)
        block.Send(input);

    block.Complete();
    block.Completion.Wait();

    return outputs.ToArray();
}