并行性和异步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中文网其他相关文章!