非同期プログラミングでは、スロットリングを実現するために、一度に実行できる同時タスクの数を制限することが必要になることがよくあります。これは、複数の 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 中国語 Web サイトの他の関連記事を参照してください。