在非同步程式設計中,經常需要限制任何給定時間可以執行的並發任務數量以實現節流。這在進行多個 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中文網其他相關文章!