管理大量非同步操作的並發執行通常需要任務限制。 任務並行庫 (TPL) 資料流為這一常見挑戰提供了一個優雅的解決方案。
TPL Dataflow 的 TransformBlock<TInput, TOutput>
提供了一個強大的機制來控制平行任務執行的最大層級。 這使您可以有效地處理資料流(如 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); //or await downloader.SendAsync(url); downloader.Complete(); await downloader.Completion; IList<HttpResponse> responses; if (buffer.TryReceiveAll(out responses)) { //process responses }</code>
此程式碼建立一個 TransformBlock
(名為 downloader
),將並發下載限制為 50。 downloader
連結到 BufferBlock
(buffer
) 以保存 HttpResponse
物件。 提交所有 URL 後,我們發出完成信號並等待 downloader
完成。 最後,從 buffer
.
TPL Dataflow 比手動節流方法有顯著優勢:
值得注意的是,TransformBlock
緩衝輸入和輸出。 為了防止潛在的死鎖,請將其連結到單獨的 BufferBlock
,如上所示,並建議在完成後檢索結果。
以上是TPL資料流如何簡化非同步任務限制?的詳細內容。更多資訊請關注PHP中文網其他相關文章!