C# 异步编程Task(三) async、await
一、async和await两个修饰符
C#5.0的时候引入了async和await两个修饰符,成为异步编程的核心关键字。
async 是修饰符,表明方法含有异步操作,但并不是说整个方法是异步的。async修饰的方法会先同步执行到第一处await的地方而后开始异步。
await可以理解为一异步特有的“return”。即返回一个正在运行的异步过程。并且等待该异步过程结束后再继续向await的下一句运行。
private static async void MainAsync() { Console.WriteLine("Application Start"); await AsyncTask1();//编译报错,“无法等待void” Console.WriteLine("Application End"); } private static async void AsyncTask1() { Console.WriteLine("AsyncVoid1"); Thread.Sleep(1000); Console.WriteLine("AsyncVoid1: befor await"); await Task.Run(() => { Console.WriteLine("AsyncVoid1: Task Runing"); Thread.Sleep(2000); }); Console.WriteLine("AsyncVoid1: after await"); }
static void Main(string[] args) { //控制台Main入口不能加async MainAsync(); } //方法内有await时,方法必须被async修饰。 private static async void MainAsync() { Console.WriteLine("Application Start"); await AsyncTask1(); Console.WriteLine("Application End"); }
运行结果:
Application Start
AsyncVoid1
AsyncVoid1: befor await
AsyncVoid1: Task Runing
AsyncVoid1: after await
Application End
二、异步返回类型
async是方法的修饰,其对应的方法的返回值有
void
Task
Task<T>
任何具有可访问的 GetAwaiter 方法的类型(GetAwaiter 方法返回的对象必须实现 ystem.Runtime.CompilerServices.ICriticalNotifyCompletion 接口)。
IAsyncEnumerable(对于返回异步流的异步方法)。
常用的是前三个。暂且置整理前三者的区别与不同。
三、async Task
返回Task类型的。个人概括的说,就是“执行操作但不返回任何值的异步方法”。即await 等待的一个无返回值的Task。
private static async Task<int> AsyncFuncReturn1() { await Task.Run(() => { Thread.Sleep(500); }); return 1; } private static Task<int> AsyncFuncReturn2() { return Task<int>.Run(() => { Thread.Sleep(500); return 1; }); }
四、await 和 Task.Wait()/Task.Result
await 和Task.Wait()的作用都有等待任务结束的功能,不同的是,就想前面说的,await还有一层“return”的意思,或者说更像“yield”。即让await所在方法的被调用者可以继续下一步操作。(这里只是说“可以”,即对外产生这样的能力,而如果await所在方法返回的值是void类型,调用者就不能强制同步了)
更多: