与异步lambda函数的并行处理
结合并行处理和异步lambda函数需要仔细考虑。 本文解决了在
中使用方法的挑战,并提供有效的解决方案。async
Parallel.ForEach
>
的问题
启动背景线程,这些线程本质上不等待任务完成。 这会在Lambda表达式内使用时会产生问题。以下示例说明了此问题:Parallel.ForEach
await
<code class="language-csharp">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</code>
的好处,并且需要明确的例外处理:count
Wait()
使用task.whenall await
<code class="language-csharp">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;</code>
一个更有效的解决方案涉及利用来管理异步操作:
Task.WhenAll
这种方法允许各项处理每个项目,并确保所有任务在继续执行之前完成。
<code class="language-csharp">var bag = new ConcurrentBag<object>(); var tasks = myCollection.Select(async item => { // some pre-processing var response = await GetData(item); bag.Add(response); // some post-processing }); await Task.WhenAll(tasks); var count = bag.Count; // count will be correct</code>
Task.WhenAll
>
以上是我如何与Parallel.Foreach合适使用异步Lambda函数?的详细内容。更多信息请关注PHP中文网其他相关文章!