使用TPL Dataflow限制非同步任務並發數
本文探討如何利用TPL Dataflow有效率地限制並發非同步任務的數量,同時充分利用多執行緒優勢。與使用BlockingCollection
和SemaphoreSlim
的ThrottleTasksAsync
方法相比,TPL Dataflow提供了更簡潔的解決方案。
透過配置TransformBlock
的MaxDegreeOfParallelism
屬性,我們可以直接指定並發執行任務的最大數量。將URL加入TransformBlock
中,它會非同步處理這些URL。處理完成後,即可取得結果。
<code class="language-csharp">var downloader = new TransformBlock<string, HttpResponse>( url => Download(url), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 50 } ); var buffer = new BufferBlock<HttpResponse>(); downloader.LinkTo(buffer); foreach (var url in urls) downloader.Post(url); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { // 处理结果 }</code>
要注意的是,TransformBlock
會緩衝輸入和輸出。因此,我們使用BufferBlock
與它連接,防止TransformBlock
在所有輸出項被消費之前阻塞。 BufferBlock.TryReceiveAll
方法用於在TransformBlock
完成後檢索所有結果。
以上是TPL資料流如何限制並發非同步任務?的詳細內容。更多資訊請關注PHP中文網其他相關文章!