本文共 1327 字,大约阅读时间需要 4 分钟。
static void Main(string[] args){ Console.WriteLine("-------主线程启动-------"); Task task = GetStrLengthAsync(); Console.WriteLine("主线程继续执行"); Console.WriteLine("Task返回的值" + task.Result); Console.WriteLine("-------主线程结束-------");}static async Task GetStrLengthAsync(){ Console.WriteLine("GetStrLengthAsync方法开始执行"); //此处返回的中的字符串类型,而不是Task string str = await GetString(); Console.WriteLine("GetStrLengthAsync方法执行结束"); return str.Length;}static Task GetString(){ //Console.WriteLine("GetString方法开始执行") return Task .Run(() => { Thread.Sleep(2000); return "GetString的返回值"; });}
async用来修饰方法,表明这个方法是异步的,声明的方法的返回类型必须为:void,Task或Task。
await必须用来修饰Task或Task,而且只能出现在已经用async关键字修饰的异步方法中。
通常情况下,async/await成对出现才有意义可以看出来,main函数调用GetStrLengthAsync方法后,在await之前,都是同步执行的,直到遇到await关键字,main函数才返回继续执行。
那么是否是在遇到await关键字的时候程序自动开启了一个后台线程去执行GetString方法呢?
现在把GetString方法中的那行注释加上,运行的结果是:
在遇到await关键字后,没有继续执行GetStrLengthAsync方法后面的操作,也没有马上反回到main函数中,而是执行了GetString的第一行,以此可以判断await这里并没有开启新的线程去执行GetString方法,而是以同步的方式让GetString方法执行,等到执行到GetString方法中的Task.Run()的时候才由Task开启了后台线程!那么await的作用是什么呢?
可以从字面上理解,上面提到task.wait可以让主线程等待后台线程执行完毕,await和wait类似,同样是等待,等待Task.Run()开始的后台线程执行完毕,不同的是await不会阻塞主线程,只会让GetStrLengthAsync方法暂停执行
转载地址:http://ujrxo.baihongyu.com/