C# 多线程学习 (二)--- 异步函数

异步函数是C# 5.0引入的新语言特性。使用异步函数可以规避人为线程操作,简化了异步编程的方法。

关键词 Async、Await

使用关键词async 、await创建异步函数,首先使用async标记异步函数,返回结果是Task、Task< T > 、void。异步函数内需要用await标记函数内异步操作。

异步函数的调用过程:

  1. 在线程池中发起await标记的异步操作,返回工作线程;
  2. 工作线程继续执行后续操作,直至await标记的异步操作完成;
  3. 当异步操作完成后,执行异步函数中后续操作。

限制条件:

  • 控制台程序的Main函数不能标记为async
  • catch、finally、unsafe、lock代码块中不能使用await操作符

注意:

  1. 通过async调用方法比正常调用方法慢40~50倍,对性能有一定影响,故需在必要时使用;
  2. 如果在工作线程中直接调用异步函数结果,则会阻塞当前线程,直至异步函数完成;
  3. 在不需要捕获线程上下文中,可使用ConfigureAwait,避免由于切换上下文带来的额外开销。
 class Program
 {
    static void Main(string[] args)
    {
         var task = GetAsyncWithAwait();
         Console.WriteLine("In Main");
         task.Wait();
         Console.ReadKey();
     }

    public async static Task GetAsyncWithAwait()
    {
         //显式指定 lambda表达式返回类型
         //多个await 顺序执行
         Func<string,Task<string>> t1 = async o=>
         {
             await Task.Delay(10);
             Console.WriteLine("Wait 10s");
             return o;
          };
          var t2 = await AsyncTest();
          var str = await t1(t2);
          Console.WriteLine(str);
      }

     public async static Task<string> AsyncTest()
     {
         await Task.Delay(100);
         return "AsyncTest Is Done";
     } 
 }

捕获异常

当await标记一个及一个以上异步操作时,使用Exception.Flatten()将层级异常存入列表中。

public static async Task CatchException()
{
    var t1 = TaskOne();
    var t2 = TaskTwo();
    var task = Task.WhenAll(t1, t2);
    try
    {
        await task;
    }
    catch
    {
        var ae = task.Exception.Flatten();
        var ex = ae.InnerExceptions;
        foreach (var item in ex)
        {
            Console.WriteLine($"{item.Message}");
        }
    }
}

public async static Task TaskOne()
{
    await Task.Delay(10);
    throw new Exception($"TaskOne is Done, CurrentThreadId is {Thread.CurrentThread.ManagedThreadId}");
}

public async static Task TaskTwo()
{
    await Task.Delay(100);
    throw new Exception($"TaskTwo is Done, CurrentThreadId is {Thread.CurrentThread.ManagedThreadId}");
}

参考资源

性能:了解 Async 和 Await 的成本

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值