ホームページ >バックエンド開発 >C++ >C# ForEach ループ内で非同期操作を適切に処理する方法

C# ForEach ループ内で非同期操作を適切に処理する方法

Susan Sarandon
Susan Sarandonオリジナル
2025-01-05 09:38:12373ブラウズ

How to Properly Handle Asynchronous Operations within a C# ForEach Loop?

Async と ForEach を使用したデータのクエリ

C# で非同期操作を扱う場合、非同期操作をコードと適切に統合する方法を理解することが重要ですForEach のようなブロック。 ForEach ステートメント内で Async キーワードを使用しようとすると、一般的な問題が 1 つ発生し、コンパイル エラーが発生する可能性があります。

エラー: Async は現在のコンテキストに存在しません

以下のコード スニペットに示されているように、ForEach ステートメント内で Async を使用しようとすると、 error:

using (DataContext db = new DataLayer.DataContext())
{
    db.Groups.ToList().ForEach(i => async {
        await GetAdminsFromGroup(i.Gid);
    });
}

現在のコンテキストに「Async」という名前が存在しないため、エラーが発生します。これは、ForEach が非同期デリゲートをサポートしていないためです。

Task.WhenAll を使用した代替アプローチ

ForEach ステートメント内で非同期操作を効果的に処理するには、Task を使用できます。 WhenAll メソッド。このアプローチには、各要素を非同期操作に投影することが含まれます。

using (DataContext db = new DataLayer.DataContext())
{
    var tasks = db.Groups.ToList().Select(i => GetAdminsFromGroupAsync(i.Gid));
    var results = await Task.WhenAll(tasks);
}

このアプローチには、いくつかの利点があります。

  • 適切なエラー処理: 非同期 void メソッドは使用できません。キャッチで捕まりました。 Task.WhenAll では自然な例外処理が可能です。
  • 完了の認識: Task.WhenAll を使用すると、すべての非同期操作がいつ完了したかを判断できます。
  • Natural結果を取得するための構文: GetAdminsFromGroupAsync は、結果を生成する操作を意味します。副作用として設定されるのではなく、自然に返されます。

以上がC# ForEach ループ内で非同期操作を適切に処理する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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