C# 使用多个异步方法

软谋的.NET全套架构视频,大多视频包含源码,录制时间(初中级是2019~2020高级架构是2020~2021),原价6499,现仅需299元。这个活动周三推出后,受到热捧,仅一个技术群就几十人抢购!最后几天活动,目录和介绍:

点击下方超链接查看:

太牛了!三天时间几百人加我咨询这份.NET架构视频

需要的加微zls20210502,进技术群的加微mm1552923,备注进群

f9ca7437b4831756c97873962b8fc166.png

在一个异步方法中,可以调用一个或多个异步方法。如何编写代码,取决于一个异步方法的结果是否依靠于另一个异步方法。

01 按顺序调用异步方法

e8594d6ab10286dead2042a1a95f4e45.png

使用 await 关键字可以调用每个异步方法。在有些情况下,如果一个异步方法依赖另一个异步方法的结果,await 关键字就非常有用。在这里,GreetingAsync 异步方法的第二次调用完全独立于其第一次调用的结果。这样,如果每个异步方法都不使用 await,那么整个 MultipleAsyncMethods 异步方法将更快地返回结果,如下所示:

private async static void MultipleAsyncMethods()
{
  string sl = await GreetingAsync("Stephanie"); 
  string s2 = await GreetingAsync("Matthias");
  Console.WriteLine($"Finished both methods.{Environment.NewLine) " +
    $"Result 1: {s1}{Environment.NewLine} Result 2:{s2}");
}

02 使用组合器

3b5ef93e24df087231a1b9c8ebfa8a61.png

如果异步方法不依赖于其他异步方法,则每个异步方法都不使用 await,而是把每个异步方法的返回结果赋值给 Task 变量,就会运行得更快。GreetingAsync 方法返回 Task<string>。这些方法现在可以并行运行了。组合器可以帮助实现这一点。一个组合器可以接受多个同一类型的参数,并返回同一类型的值。多个同一类型的参数被组合成一个参数来传递。Task 组合器接受多个 Task 对象作为参数,并返回一个 Task。

示例代码调用 Task.WhenAll 组合器方法,它可以等待,直到两个任务都完成:

private async static void MultipleAsyncMethodsWithCombinators1()
{
  Task<string> tl = GreetingAsync("Stephanie");
  Task<string> t2 = GreetingAsync("Matthias"); 
  await Task.WhenAll(t1, t2);
  Console.WriteLine($"Finished both methods.{Environment.NewLine) " +
    $"Result 1:{t1.Result}{Environment.NewLine} Result 2: {t2.Result}");
}

Task 类定义了 WhenAll 和 WhenAny 组合器。从 WhenAll 方法返回的 Task,是在所有传入方法的任务都完成了才会返回 Task。从 WhenAny 方法返回的 Task,是在其中一个传入方法的任务完成了就会返回 Task。

Task 类型的 WhenAll 方法定义了几个重载版本。如果所有的任务返回相同的类型,那么该类型的数组可用于 await 返回的结果。GreetingAsync 方法返回一个 Task<string>,等待返回的结果是一个字符串(string)形式。因此,Task.WhenAll 可用于返回一个字符串数组:

private async static void MultipleAsyncMethodsWithCombinators2()
{
  Task<string> t1 = GreetingAsync("Stephanie"); 
  Task<string> t2 = GreetingAsync("Matthias"); 
  string[] result = await Task.WhenAll(t1, t2);
  Console.WriteLine($"Finished both methods.{Environment.NewLine} " +
  $"Result 1:{result[0]}{Enviornment.NewLine} Result 2:{result[1]}");
}

只有等待的所有任务都完成时某个任务才能继续,WhenAll 方法就有实际用途。当调用任务在等待完成的任何任务都完成才能执行操作时,可以使用 WhenAny 方法。它可以使用任务的结果继续。

往期推荐

·  C# 数据流

·  C# 类型系统

·  C# 面向对象的编程

·  C# 执行 SQL 语句

·  C# 连接数据库

·  C# 迭代器

c6205b30a9c2adc2d9b85a7c830ab84f.png

Love life,love yourself

关注小编不迷路呦~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值