並行性和異步lambdas:平衡行為
通過在多個核心上分配工作負載,並行處理可顯著提高性能。 但是,將異步的lambda表達式集成在平行環內提出了獨特的挑戰。
問題:丟失任務
考慮此示例:
<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>
>
有效解決方案
用於使用異步lambdas的直接並行處理:
<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;</code>
確保所有任務在繼續之前完成。 Task.WhenAll
>
以上是可以並行有效地利用異步lambda表達式嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!