博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
async/await
阅读量:6677 次
发布时间:2019-06-25

本文共 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/

你可能感兴趣的文章
spring mvc-使用Servlet原生API作为参数
查看>>
第13章 MySQL数据库与JDBC编程
查看>>
百度地图API使用记录
查看>>
linux docker
查看>>
增量式 爬虫
查看>>
第九周作业
查看>>
CefSharp的一些初始化操作
查看>>
使用Git Hooks实现开发部署任务自动化
查看>>
百度离线地图
查看>>
Myeclipse项目中Source、Projects、Libraries、Order and export含义
查看>>
制作H5响应式页面注意事项、微信二次分享
查看>>
C# JS URL 中文传参出现乱码的解决方法
查看>>
CCF能力认证历届第二题
查看>>
Array 的五种迭代方法 -----every() /filter() /forEach() /map() /some()
查看>>
[转]Linux(centOS6.5)下SVN的安装、配置及开机启动
查看>>
putchar()
查看>>
050:navie时间和aware时间详解
查看>>
itertools
查看>>
centos7修改密码
查看>>
nodejs将PDF文件转换成txt文本,并利用python处理转换后的文本文件
查看>>