TPL Dataflow を使用して同時非同期タスクの数を制限する
この記事では、TPL Dataflow を使用して、マルチスレッドを最大限に活用しながら同時非同期タスクの数を効率的に制限する方法について説明します。 BlockingCollection
と SemaphoreSlim
を使用する ThrottleTasksAsync
アプローチと比較して、TPL Dataflow はよりクリーンなソリューションを提供します。
TransformBlock
のMaxDegreeOfParallelism
属性を設定することで、同時実行タスクの最大数を直接指定できます。 URL を TransformBlock
に追加すると、非同期で処理されます。処理が完了すると、結果が表示されます。
<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 中国語 Web サイトの他の関連記事を参照してください。