並列性と非同期ラムダ:バランスのとれた行為
並列処理は、複数のコアにワークロードを分散することにより、パフォーマンスを大幅に向上させます。 ただし、並列ループ内に非同期のラムダ式を統合すると、ユニークな課題があります。
問題:失われたタスク この例を考えてみましょう:
<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>
の背景スレッドが非同期操作が完了するのを待たないため、頻繁に0のままです。 これを修正しようとする素朴な試み:count
Parallel.ForEach
<code class="language-csharp">var bag = new ConcurrentBag<object>(); Parallel.ForEach(myCollection, item => { // Pre-processing var responseTask = GetData(item); responseTask.Wait(); var response = responseTask.Result; bag.Add(response); // Post-processing }); var count = bag.Count;</code>
効果的な解決策
このアプローチは、各アイテムのタスクを作成し、非同期実行を可能にします。 継続する前にすべてのタスクが終了するようにします。
より複雑なシナリオについては、Stephen Toubのブログ投稿は、高度なテクニックとベストプラクティスを提供しています。 これにより、並列ループ内で非同期操作を処理するためのより堅牢で効率的なソリューションが提供されます。
以上が並列。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。