首页 >后端开发 >C++ >如何在 C# 中高效地使用 Async/Await 执行多个并行任务?

如何在 C# 中高效地使用 Async/Await 执行多个并行任务?

Susan Sarandon
Susan Sarandon原创
2025-01-22 03:21:08173浏览

How Can I Efficiently Use Async/Await for Multiple Parallel Tasks in C#?

C#中高效使用Async/Await处理多个任务

场景

假设使用一个异步API客户端,它返回Task或Task,类似于以下示例:

<code class="language-csharp">static async Task DoSomething(int siteId, int postId, IBlogClient client)
{
    await client.DeletePost(siteId, postId); // 调用API客户端
    Console.WriteLine("已删除帖子 {0}.", siteId);
}</code>

目标是同时启动多个异步任务并等待它们完成。两种常用的方法是Parallel.ForEach和Task.WaitAll。

现有方法的不足

虽然Parallel.ForEach和Task.WaitAll都尝试并行执行任务,但它们存在局限性。

  • Parallel.ForEach with Wait(): 尽管任务并发执行,但Wait()调用会阻塞每个参与的线程。因此,如果任务中的网络调用需要2秒,则每个线程在此期间保持空闲,降低效率。
  • Task.WaitAll: 同样,此方法会阻塞当前线程,直到任务完成。在此阻塞期间,线程无法处理其他任务。

推荐方法

为了克服这些限制,我们建议使用Task.WhenAll,它可以异步并行执行任务。以下代码演示了它的用法:

<code class="language-csharp">public async Task DoWork() {

    int[] ids = new[] { 1, 2, 3, 4, 5 };
    await Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

在这种情况下,由于任务完成后没有后续操作,因此不需要await。以下简化的代码就足够了:

<code class="language-csharp">public Task DoWork() 
{
    int[] ids = new[] { 1, 2, 3, 4, 5 };
    return Task.WhenAll(ids.Select(i => DoSomething(1, i, blogClient)));
}</code>

有关这些方法的更多见解和比较,请参阅综合博客文章:“如何以及在何处使用ASP.NET Web API进行并发异步I/O”。

以上是如何在 C# 中高效地使用 Async/Await 执行多个并行任务?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn