ホームページ > バックエンド開発 > C++ > C# で複数の並列タスクに Async/Await を効率的に使用するにはどうすればよいですか?

C# で複数の並列タスクに Async/Await を効率的に使用するにはどうすればよいですか?

Susan Sarandon
リリース: 2025-01-22 03:21:08
オリジナル
187 人が閲覧しました

How Can I Efficiently Use Async/Await for Multiple Parallel Tasks in C#?

Async/Await を効率的に使用して C# で複数のタスクを処理する

シーン

次の例のように、Task または Task を返す非同期 API クライアントが使用されていると仮定します:

<code class="language-csharp">static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // 调用API客户端
    Console.WriteLine("已删除帖子 {0}.", siteId);
}</code>
ログイン後にコピー

目標は、複数の非同期タスクを同時に開始し、完了するまで待つことです。よく使用される 2 つのメソッドは、Parallel.ForEach と Task.WaitAll です。

既存の方法の欠点

Parallel.ForEach と Task.WaitAll は両方ともタスクを並列実行しようとしますが、制限があります。

  • Parallel.ForEach with Wait(): タスクは同時に実行されますが、Wait() 呼び出しは参加している各スレッドをブロックします。したがって、タスク内のネットワーク呼び出しに 2 秒かかる場合、その間各スレッドはアイドル状態のままとなり、効率が低下します。
  • Task.WaitAll: 繰り返しますが、このメソッドはタスクが完了するまで現在のスレッドをブロックします。このブロック期間中、スレッドは他のタスクを処理できません。

おすすめの方法

これらの制限を克服するには、タスクを非同期かつ並列で実行できる Task.WhenAll を使用することをお勧めします。次のコードはその使用法を示しています:

<code class="language-csharp">public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>
ログイン後にコピー

この場合、タスク完了後の後続動作はないため、await は必要ありません。次の簡略化されたコードで十分です:

<code class="language-csharp">public Task DoWork() 
{
    int[] ids = new[] { 1, 2, 3, 4, 5 };
    return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>
ログイン後にコピー

これらのアプローチの詳細と比較については、包括的なブログ投稿「同時非同期 I/O に ASP.NET Web API を使用する方法と場所」を参照してください。

以上がC# で複数の並列タスクに Async/Await を効率的に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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