非同期Lambda関数を使用した並列処理
並列処理と非同期のラムダ関数を組み合わせるには、慎重に検討する必要があります。 この記事では、
内でメソッドを使用することの課題について説明し、効果的なソリューションを提供します。
async
Parallel.ForEach
並列の問題とasync lambdas
タスクの完了を本質的に待っていない背景スレッドを起動します。 これにより、Lambda式の内部で
を使用すると問題が発生します。次の例は、この問題を示しています
Parallel.ForEach
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, async item => { // some pre-processing var response = await GetData(item); bag.Add(response); // some post-processing }); var count = bag.Count; // count will be 0
count
ソリューション
Wait()
より効率的なソリューションでは、非同期操作を管理するためのawait
を活用することを伴います:
var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // some pre-processing var responseTask = GetData(item); responseTask.Wait(); var response = responseTask.Result; bag.Add(response); // some post-processing }); var count = bag.Count;
このアプローチにより、各アイテムを非同期に処理することができ、進行前にすべてのタスクが完了するようにします。
高度なソリューション:foreachasync Task.WhenAll
より洗練された非同期並列処理については、Stephen Toubのブログ投稿を
以上が非同期lambda関数を並列で適切に使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。