ホームページ >バックエンド開発 >C++ >並列内で非同期操作を適切に待っているにはどうすればよいですか。

並列内で非同期操作を適切に待っているにはどうすればよいですか。

Susan Sarandon
Susan Sarandonオリジナル
2025-02-01 03:21:08395ブラウズ

How Can I Properly Await Asynchronous Operations within a Parallel.ForEach Loop in C#?

C#

Parallel.ForEach>> アプリケーションのパフォーマンスの向上には、並列処理が必要になることがよくあります。 ただし、非同期操作(

/async)とawaitのような並列ループを組み合わせて、独自の課題を提示します。 この記事では、これらの課題に対処し、並列ループ内で非同期タスクを正しく待っているソリューションを提供します。 Parallel.ForEach

問題:非同期タスクと

Parallel.ForEach C#のキーワードは、非同期プログラミングを有効にし、

オブジェクトを返します。 バックグラウンドスレッドは、ループが完了する前に非同期タスクが終了するのを本質的に待っていないため、

内でasyncメソッドを使用する場合に問題が発生します。 この例を考えてみましょう:Task async Parallel.ForEach

バックグラウンドスレッドが非同期操作を完了する前にメインスレッドが進行するため、頻繁に0を返します。

解決策:
<code class="language-csharp">var bag = new ConcurrentBag<object>();
Parallel.ForEach(myCollection, async item =>
{
    // Pre-processing
    var response = await GetData(item);
    bag.Add(response);
    // Post-processing
});
var count = bag.Count; // count is often 0!</code>
および

count

を使用します

堅牢なソリューションには、オブジェクトのコレクションを作成し、すべてのタスクが終了するのを待つためにSelectを使用することが含まれます。 Task.WhenAll このアプローチでは、

高度なソリューション:Select TaskTask.WhenAll より複雑なシナリオについては、スティーブントーブのブログ投稿

は、より洗練された適応性のあるソリューションを提供します:
<code class="language-csharp">var bag = new ConcurrentBag<object>();
var tasks = myCollection.Select(async item =>
{
    // Pre-processing
    var response = await GetData(item);
    bag.Add(response);
    // Post-processing
});
await Task.WhenAll(tasks);
var count = bag.Count; // count will be correct</code>

Selecthttps://www.php.cn/link/33edf41c0becd0d57c35c4e27276617b Task.WhenAllbag

これは、特に潜在的な例外やキャンセルを扱う場合、並行して非同期操作を処理するためのより制御された効率的な方法を提供します。 単純な

以上が並列内で非同期操作を適切に待っているにはどうすればよいですか。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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