首页 新闻 会员 周边

C# 调用异步方法会不会导致所有函数都变成异步了??

0
悬赏园豆:10 [待解决问题]

有一个疑问:

假如有一个异步方法 A,

方法 B 调用 A, 为了能await A,必须加上async关键字,把自己变成异步方法,

方法 C 调用 B, 为了能await B,也要加上async关键字,把自己变成异步方法,

这样就无限循环了,最后所有方法都要加async关键字,变成异步方法了??

这种做法是对还是错呢?如果是错的,正确的做法是什么呢?

萨尔的主页 萨尔 | 初学一级 | 园豆:20
提问于:2017-12-04 09:09
< >
分享
所有回答(3)
0

不一定。

不用await就是了。

但实际上这个关键字约束async是对的,你可以实际分析一下场景使用 —— 并且不这么如果你的程序是client(android貌似是4.0以后强制异步调用work thread)那么是可能僵死的。

说说不用await,你可以自行处理,比如堵塞,等待直到该异步函数完成 —— 很明显假设你写在form onclick,由于堵塞,界面可能僵死。

花飘水流兮 | 园豆:13560 (专家六级) | 2017-12-04 10:00
0

所以后来连main方法都开始async了。

不过并不是一定是这样需要全程async,使用async是让你在某些操作时(比如io)可以使用更简单的方式来将等待时间挪作他用增加整体吞吐量,如果只是在特定场景下需要这样做可以在外边强行同步嘛(不过要注意规避死锁)。

但反过来想,如果你一个地方需要异步,那么是不是调用这个地方也需要异步?(外边的异步是因为里面有了异步,如果外边不异步同样还是会导致线程等待)所以这样撸下去的确就变成了全程异步了。

Daniel Cai | 园豆:10424 (专家六级) | 2017-12-04 10:06
0

首先要知道为什么要用异步,异步用来解决什么问题的。

1. 在client程序中,异步可以不阻塞主线程

2. 在web程序中,异步可以提升吞吐量

第1种情况,例如,处理按钮点击事件,那么需要把事件处理方法加上async。第2种情况,web本身就是异步的,所以基本上都可以async。

ps:在asp.net core中,千万不要在同步中调用异步,否则在并发是容易发生死锁,只能接受请求,却无法处理。

蝌蝌 | 园豆:158 (初学一级) | 2017-12-04 16:46
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册