并行性和异步lambdas:平衡行为
通过在多个核心上分配工作负载,并行处理可显着提高性能。 但是,将异步的lambda表达式集成在平行环内提出了独特的挑战。
问题:丢失任务
考虑此示例:
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
<>>经常保留0,因为count
>的背景线程不会等待异步操作完成。 幼稚的尝试解决此问题:Parallel.ForEach
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;
>
有效解决方案
用于使用异步lambdas的直接并行处理:
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;
确保所有任务在继续之前完成。Task.WhenAll
>
以上是可以并行有效地利用异步lambda表达式吗?的详细内容。更多信息请关注PHP中文网其他相关文章!