在异步编程中,经常需要限制任何给定时间可以执行的并发任务数量以实现节流。这在进行多个 API 调用或处理大型数据集时尤其有用。
提供的 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 来实现并行化,在指定的并行度内。
虽然 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中文网其他相关文章!