首页 > 后端开发 > C++ > 我如何在平行中正确等待异步操作。

我如何在平行中正确等待异步操作。

Susan Sarandon
发布: 2025-02-01 03:21:08
原创
347 人浏览过

How Can I Properly Await Asynchronous Operations within a Parallel.ForEach Loop in C#?

在C#

Parallel.ForEach中,

并行异步操作 async改善应用程序性能通常涉及并行处理。 但是,将异步操作(await/Parallel.ForEach)与像

>这样的并行循环相结合,提出了独特的挑战。 本文解决了这些挑战,并提供了在平行循环中正确等待异步任务的解决方案。

Parallel.ForEach问题:异步任务和

> async Task> c#中的关键字启用异步编程,返回async>对象。 在Parallel.ForEach>内使用

>方法时,出现了问题,因为背景线程在循环完成之前就不会固有地等待异步任务完成。

考虑此示例:

<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>
登录后复制

>count>经常返回0,因为主线程在背景线程完成其异步操作之前进行。

解决方案:使用Select>和Task.WhenAll

> Select一个可靠的解决方案涉及Task>创建一个Task.WhenAll对象的集合,

>等待所有任务完成:
<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; // count will be correct</code>
登录后复制

Select此方法启动异步操作,同时使用Task.WhenAll>,然后使用bag>在访问

>。

高级解决方案:ForEachAsync

>有关更复杂的方案,史蒂芬·图布(Stephen Toub)的博客文章提供了一个更复杂和适应性的解决方案:ForEachAsync

https://www.php.cn/link/33edf41c0becd0d57c35c35c35c4c4e27276617b

>这提供了一种更有控制和有效的方法来处理平行异步操作,尤其是在处理潜在的例外或取消时。 与简单的

/Select方法相比,它提供了一种更强大,更灵活的方法。

以上是我如何在平行中正确等待异步操作。的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板