首页 新闻 会员 周边 捐助

async与await的疑问,await是导致线程同步吗?

0
[已解决问题] 解决于 2015-07-24 14:33

1、被async标记的方法FunA(),在调用时如果写成 await FunA(),应该是继续执行主线程,FunA()方法,作为异步线程去执行?

2、被async标记的方法FunA(),如果有返回值,在调用时如果写成var result=await FunA(),应该是会阻塞主线程,直到FunA()方法返回结果后才执行?

3、被async标记的方法FunA(),如果有返回值,在调用时如果写成var result=FunA(),则继续执行主线程,FunA()方法,会作为异步线程去执行,然后在主线程中调用 await result时,会阻塞主线程,直到FunA()执行完毕有返回值。得到result后,再继续执行主线程。

 

请问以上三条流程,我理解的对吗?如果不对,请问哪里有问题?

铁手三郎的主页 铁手三郎 | 菜鸟二级 | 园豆:311
提问于:2015-06-24 18:38
< >
分享
最佳答案
1

1. 基本上是没错的

2. 不是很准确,await前后的代码虽然在同一个方法的内部,但是是被不同的线程执行的,主线程其实是没有被阻塞的

3. 没太看明白和问题2的差别。。。

有兴趣的话欢迎看看我的这篇随笔:D

http://www.cnblogs.com/vd630/p/4596203.html

奖励园豆:5
VD630 | 初学一级 |园豆:82 | 2015-06-24 22:42

2和3的 await位置不同,

2中是在var result = await FunA(); 

3中是在var result=FunA();  ... Console.WriteLine(await result); 这里使用await

这两种情况的运行有区别吗? 2是不是直接阻塞主线程,3是要到Console那里才阻塞?

铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 14:16

后面我自己在跑了几种情况,根据结果,问题基本解决了,谢谢

铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 16:08

@cloud_915: 

额。。。两个result的类型不一样啊,2里头的result是Task执行后GetResult的返回值,3里头的result就直接是个没执行过的Task。

我也说过了,不管怎么样await其实都没有阻塞,使用await的方法必须标记成async

只是主线程会把await以及await之后的操作都交给线程池去完成

VD630 | 园豆:82 (初学一级) | 2015-06-25 16:18

@VD630:

2和3中result类型一样吧

 

如果你在FunA()中 await Task.Delay(2000); 并且在主线程中进行其他操作,比如Console;

当调用FunA()时,就标记await如2中描述,就会让主线程等待;

当调用FunA()时,没有标记await,如3中描述,而是在调用result时标记await,在调用result之前,主线程和FunA()会同时进行,包括主线程中有Console,同样会执行。而主线程中await之后如果有Console,那么必须等待FunA()执行完毕,才可以。

铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 16:41

@cloud_915: 

不一样的。。。你别用var就能看出来了

你在调用async方法的后面加一个Console.Write就能看出来了,主线程是没有被阻塞的,不然它为啥叫async啊。。。

建议你看看我写的这篇随笔:D

VD630 | 园豆:82 (初学一级) | 2015-06-25 17:03
其他回答(2)
-3
#1楼 2014-11-04 09:48 Charlie123  
为何不能使用unsigned int来定义字段呢?总是出错。是不是我写错了??
 
 把 数据类型先在前面 ,你写反了.
 
思乐兄 | 园豆:202 (菜鸟二级) | 2015-06-24 19:22
0

基本上是错了。你仔细看下这里的例子:https://msdn.microsoft.com/en-us/library/hh156528.aspx

Launcher | 园豆:45050 (高人七级) | 2015-06-25 09:21

问题出在哪里?

支持(0) 反对(0) 铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 14:13

@cloud_915: 问题在于你不能老提“线程”。遇到 await 时,我们应该多说“挂起”。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-25 14:25

@Launcher: 草,你丫要是没有实在的回答,就别留言,老提有的没的。去别处装B

支持(0) 反对(0) 铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 14:32

@cloud_915: 激将法不管用。你能删除我的回帖吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-25 14:41

@Launcher: 你看不出我是在骂你么,别太把自己当回事,还激将法,呵呵

支持(0) 反对(0) 铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 14:56

@cloud_915: 我能看出你对 async 和 await 理解的错误,我怎么会看不出来你在骂我呢?本来开始想一步一步的慢慢把这两个概念讲清楚了,但是由于你这人态度不好,人品太差,所以我就在这里闲聊,看你的笑话。你能删除我的回帖吗?

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-25 14:59

@Launcher:  你这种人的思路就是,先从别人的问题挑刺,却不直接回答问题,先把自己身价太高,显得自己多牛B,可以不停的在刺儿上追加,并且巧妙的避开题主所迫切关心的问题(此处如果遇到志同道合的人,可以一问一答的扯到天南海北);

你最希望的就是题主不停的根据你的之前的追问来讨教无关信息,这样才符合你的预期,然后等你满足了自以为是的心情,就可以回到之前的问题上。

或许你知道答案,但你一开始绝对不会指出来,你需要的是借助别人的疑问来满足自己的自以为是。

网上搜索问题多了,几乎总能遇到你这种人在跟帖。

你老在提删除回帖的问题,我就纳闷了,你一直在关注这种问题吗? cao niu B。

每个跑到博问上来发问题的,都是带着迫切目的的,希望的是得到准确的答案,而不是来这里闲聊,闲聊可以去QQ群,那里从来不会聊有养分的东西。

// 说些没用的, 国内一直做不出大型的专业问答类网站,有一部分原因就是你这种人不少。

支持(0) 反对(0) 铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 15:28

@cloud_915: 有些问题的回答是需要共同的前提,在你错误的概念上按照你错误的理解给你你认为正确或者能接受的答案,那不是帮你,那是害你。而且,等到某一天你真正理解了,你就会觉得当初回答问题的人水平也不过如此,而实际上他只是为了迎合你给你想要的答案而已。

支持(0) 反对(0) Launcher | 园豆:45050 (高人七级) | 2015-06-25 15:36

@Launcher: 你将的这是后话,解决不了当前问题,而且博问不是即时聊天软件,有人问完问题会一直等,有些人,可能隔天才会上来看答案,因为手边会有其他工作。

所以我的主张一向都是直接切入根本,针对问题罗列自己的解释。而不是一问一答的方式。

每个人的方式不一样吧。

支持(0) 反对(0) 铁手三郎 | 园豆:311 (菜鸟二级) | 2015-06-25 16:07
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册