C# 关于异步等待async/await的学习理解
C# 提供了Task来实现异步操作,Task.Run可以很方便的启动一个线程执行异步任务
异步操作能提高效率,但是不便于控制,假如我们要获得异步任务的执行结果,如果采用回调的方式,传值就比较麻烦
当然也可以直接调用Task.Result以同步的方式等待异步任务执行完毕后获得结果再行处理,但是这样就会导致当前线程被阻塞,浪费性能,让人很不爽
而async/await就能避免这个问题,当我们在一个函数中使用await的时候,代码执行到这里就会停下来等待异步函数执行完毕,但是此时当前线程却不是阻塞的,因为await本质上是一个可轮询状态机,等异步任务执行完毕后,就会调用线程(应该是新的线程吧)执行之前暂停的代码,从感官上来说能以同步的形式来处理异步函数,从性能上来说,避免了当前线程的阻塞一定程度上提高了性能
仅个人理解,不知道有没有错误的地方,如有望指出,共同进步
static void Test() { Console.WriteLine("Test start..."); AAA(); //同步执行,阻塞线程 BBB(); //这里为了终止async/await的传染,没有等待,所以直接过去,不是异步等待 Console.WriteLine("Test end"); } static void AAA() { var task = Task.Run(() => { Console.WriteLine("task执行"); Thread.Sleep(3000); return 123; }); task.Wait(); //同步等待,会阻塞线程,直到异步函数执行完毕 //task.Result; //获取返回值的方式 Console.WriteLine("task执行等待完成"); } /// <summary> /// 非async修饰的函数可以直接调用BBB,整体上是个异步函数 /// 如果外部还是需要等待,就不能void,需要至少返回Task,调用的时候继续await /// </summary> static async void BBB() { var task = Task.Run(() => { Console.WriteLine("task执行"); Thread.Sleep(3000); return 123; }); int result = await task; //异步等待,await本质上是一个可轮询状态机,不会阻塞线程 //等task异步函数执行完毕后会再切到这里继续执行代码 Console.WriteLine("task执行等待完成,result=" + result); }