ホームページ > バックエンド開発 > C++ > C# で非同期タスクを調整するにはどうすればよいですか?

C# で非同期タスクを調整するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-22 20:26:10
オリジナル
968 人が閲覧しました

How Can I Throttle Asynchronous Tasks in C#?

非同期タスクを制限する

非同期プログラミングでは、スロットリングを実現するために、一度に実行できる同時タスクの数を制限することが必要になることがよくあります。これは、複数の API 呼び出しを行う場合や大規模なデータ セットを処理する場合に特に便利です。

ThrottleTasksAsync メソッド

提供されている 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 を利用して、指定された並列度内で並列化を実現します。

代替としての TPL データ フロー

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート