首页 >后端开发 >C++ >如何限制 C# 中的异步任务?

如何限制 C# 中的异步任务?

Susan Sarandon
Susan Sarandon原创
2025-01-22 20:26:10971浏览

How Can I Throttle Asynchronous Tasks in C#?

限制异步任务

在异步编程中,经常需要限制任何给定时间可以执行的并发任务数量以实现节流。这在进行多个 API 调用或处理大型数据集时尤其有用。

ThrottleTasksAsync 方法

提供的 ThrottleTasksAsync 扩展方法解决了这种情况。它接受项目的枚举、最大并发任务数和任务创建函数。它利用 BlockingCollection 和 SemaphoreSlim 来强制执行节流。

<code class="language-c#">public static async Task<result_t> ThrottleTasksAsync<enumerable_t, result_t>(
    this IEnumerable<enumerable_t> enumerable,
    int maxConcurrentTasks,
    int maxDegreeOfParallelism,
    Func<enumerable_t, Task> taskToRun)
{
    // ...
}</code>

该方法在单独的线程上运行节流器,使用 SemaphoreSlim 来控制并发任务的数量。它还利用 Parallel.ForEach 来实现并行化,在指定的并行度内。

TPL 数据流作为替代方案

虽然 ThrottleTasksAsync 方法提供了一种解决方案,但 TPL 数据流提供了一种更优雅的方法。具体来说,TransformBlock 类可用于定义任务执行的最大并行度限制。

<code class="language-c#">var downloader = new TransformBlock<string, HttpResponse>(
    url => Download(url),
    new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 });

var buffer = new BufferBlock<HttpResponse>();
downloader.LinkTo(buffer);</code>

通过将 TransformBlock 链接到 BufferBlock,块的完成不会被消费者的可用性阻塞。这允许缓冲区块在生成时收集 HttpResponse 对象,并且程序可以在处理响应之前等待下载器的完成。

以上是如何限制 C# 中的异步任务?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn