多数の非同期操作の同時実行を管理するには、多くの場合、タスクのスロットリングが必要になります。 タスク並列ライブラリ (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>
このコードは、同時ダウンロードを 50 に制限する TransformBlock
(downloader
という名前) を作成します。downloader
は、BufferBlock
オブジェクトを保持するために buffer
(HttpResponse
) にリンクされています。 すべての URL を送信した後、完了を通知し、downloader
の終了を待ちます。 最後に、収集された応答が buffer
.
TPL Dataflow には、手動のスロットリング方法に比べて大きな利点があります。
TransformBlock
は入力と出力をバッファリングすることに注意することが重要です。 潜在的なデッドロックを防ぐには、上記のように別の BufferBlock
にリンクし、完了後に結果を取得することをお勧めします。
以上がTPL データフローはどのようにして非同期タスクのスロットリングを簡素化できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。