首页 新闻 会员 周边

请教:c# ask.run 与 lambda(同步/异步)得区别

0
悬赏园豆:5 [已解决问题] 解决于 2022-07-15 07:45

最近学习 task,很多网上案例都涉及 async,和 lambda搭配的使用,基础知识不扎实,感觉有点迷,搞不懂task.run后面直接使用lambda和异步async lambda在应用上的差异到底是什么
1·搞不懂诸如
Task.Run( () => MethodA(); }
Task.Run( async () => await MethodA(); }

async Task MethodA()
{
while(true){ perform async/await operations }
}
的区别到底在哪里?(网上关于这个问题,很多事是翻译外文的帖子,看着还是迷)
个人感觉编译器 对async awaitd的处理也有关系,
2·在应用上,async lambda怎么使用,什么时候用,也是一头雾水
描述了这么多,感觉没有把问题的根描述清楚,请大神们留步多说几句,?分不多,还请谅解,谢谢,在线等

rossi努力努力的主页 rossi努力努力 | 初学一级 | 园豆:8
提问于:2022-06-25 11:31
< >
分享
最佳答案
0
  • () => MethodA(); 是匿名同步方法,这里不加 await 调用异步方法,会有副作用
  • async () => await MethodA(); 是匿名异步方法
收获园豆:5
dudu | 高人七级 |园豆:31003 | 2022-06-25 11:39

对于 Task.Run(() => MethodA());,如果 MethodA 在执行执行过程中发生异常,在 Task.Run 这层代码捕获不到

dudu | 园豆:31003 (高人七级) | 2022-06-25 11:46

Task.Run(() => MethodA()); :在一个新的线程中执行 MethodA,我不关心执行结果

dudu | 园豆:31003 (高人七级) | 2022-06-25 11:48
  • Task.Run :在新线程中执行
  • () => lambda:匿名方法
  • async/await:异步方法
dudu | 园豆:31003 (高人七级) | 2022-06-25 11:52

请问,副作用,具体指什么呢?看了您的讲解,我理解加async与不加async的一个差异体现在异常处理方面,沿着您的思路我在网上学习了下,诸如 Action action1 = async () => await DoWorkAsync();和Action action2 = () => DoWork(); 感觉在IL代码上基本是一样的,感觉更加困惑了,
1·如果async后面的lambda(此处的MethodA)没有返回值,那是否和不加async是一样的效果呢,都是无法捕捉异常,有异常则直接崩溃
2·如果async后面的lambda(此处的MethodA)有返回值(task、task<result>)这才是使用async+lambda的合理应用?
问了这么多,感觉是在请大神帮我扫盲,而且感觉越问越浅显,难为大神了,

rossi努力努力 | 园豆:8 (初学一级) | 2022-06-25 16:49

@rossi1984: IL代码一样可能是你强行将函数变为了异步函数,所以直接被编译器优化为普通函数,本身这东西只是语法糖,实际是个状态机将函数分为几个步骤干活而已。

56180825 | 园豆:1756 (小虾三级) | 2022-06-27 20:20

@dudu: 花了挺长时间消化,非常感谢

rossi努力努力 | 园豆:8 (初学一级) | 2022-07-15 07:45
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册