ホームページ >バックエンド開発 >C++ >TPL データフローは同時非同期タスクをどのように制限できますか?

TPL データフローは同時非同期タスクをどのように制限できますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-22 20:22:12544ブラウズ

How Can TPL Dataflow Limit Concurrent Asynchronous Tasks?

TPL Dataflow を使用して同時非同期タスクの数を制限する

この記事では、TPL Dataflow を使用して、マルチスレッドを最大限に活用しながら同時非同期タスクの数を効率的に制限する方法について説明します。 BlockingCollectionSemaphoreSlim を使用する ThrottleTasksAsync アプローチと比較して、TPL Dataflow はよりクリーンなソリューションを提供します。

TransformBlockMaxDegreeOfParallelism属性を設定することで、同時実行タスクの最大数を直接指定できます。 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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。