面试必备:聊聊C#中Task.Wait() 和 await 的区别和应用
简述
Task.Wait会阻止线程,在等待期间,系统不会对其它操作进行反应。 Task.Wait 是一种同步方法,该方法使调用线程等待当前任务实例完成,直到发生以下情况之一:
- 任务成功完成。
- 任务本身被取消或引发异常。 在这种情况下,您将处理 AggregateException 异常。 AggregateException.InnerExceptions属性包含有关异常的详细信息。
- 所定义的间隔 millisecondsTimeout 。 在这种情况下,当前线程将继续执行,并且该方法将返回 false
await 只是等待当前任务完成,在等待期间可以响应系统的其它操作。 await运算符暂停对其所属的 async方法的求值,直到其操作数表示的异步操作完成。异步操作完成后,await运算符将返回操作的结果(如果有)。 await必须用来修饰Task或Task<TResult>,而且只能出现在已经用async关键字修饰的异步方法中。通常情况下,async/await成对出现才有意义。
应用
Task.Wait使用案例
执行结果:
await 使用案例
先上代码
执行结果
可以看出来,main函数调用GetStrLengthAsync方法后,在await之前,都是同步执行的,直到遇到await关键字,main函数才返回继续执行。
那么是否是在遇到await关键字的时候程序自动开启了一个后台线程去执行GetString方法呢?
现在把GetString方法中的那行注释加上,运行的结果是:
大家可以看到,在遇到await关键字后,没有继续执行GetStrLengthAsync方法后面的操作,也没有马上反回到main函数中,而是执行了GetString的第一行,以此可以判断await这里并没有开启新的线程去执行GetString方法,而是以同步的方式让GetString方法执行,等到执行到GetString方法中的Task<string>.Run的时候才由Task开启了后台线程!
参考1 :https://docs.microsoft.com/zh-cn/dotnet/
版权申明:本文来源于网友收集或网友提供,仅供学习交流之用,如果有侵权,请转告版主或者留言,本公众号立即删除。
支持小微:
腾讯云 双十二活动!玩服务器的可以搞搞!
轻量服务器 2核4G 198 元/3年
爆款1核2G云服务器首年 48元
链接:https://curl.qcloud.com/2elBqJQF
右下角,您点一下在看图片
小微工资涨1毛 返回搜狐,查看更多
责任编辑: