C#
でParallel.ForEach
>> アプリケーションのパフォーマンスの向上には、並列処理が必要になることがよくあります。 ただし、非同期操作(
/async
)とawait
のような並列ループを組み合わせて、独自の課題を提示します。 この記事では、これらの課題に対処し、並列ループ内で非同期タスクを正しく待っているソリューションを提供します。
Parallel.ForEach
Parallel.ForEach
C#のキーワードは、非同期プログラミングを有効にし、
内でasync
メソッドを使用する場合に問題が発生します。
この例を考えてみましょう:Task
async
Parallel.ForEach
<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
Task
Task.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>
Select
https://www.php.cn/link/33edf41c0becd0d57c35c4e27276617b Task.WhenAll
bag
以上が並列内で非同期操作を適切に待っているにはどうすればよいですか。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。