最近学习 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怎么使用,什么时候用,也是一头雾水
描述了这么多,感觉没有把问题的根描述清楚,请大神们留步多说几句,?分不多,还请谅解,谢谢,在线等
() => MethodA();
是匿名同步方法,这里不加 await 调用异步方法,会有副作用async () => await MethodA();
是匿名异步方法对于 Task.Run(() => MethodA());
,如果 MethodA
在执行执行过程中发生异常,在 Task.Run 这层代码捕获不到
Task.Run(() => MethodA());
:在一个新的线程中执行 MethodA,我不关心执行结果
Task.Run
:在新线程中执行() =>
lambda:匿名方法async/await
:异步方法请问,副作用,具体指什么呢?看了您的讲解,我理解加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的合理应用?
问了这么多,感觉是在请大神帮我扫盲,而且感觉越问越浅显,难为大神了,
@rossi1984: IL代码一样可能是你强行将函数变为了异步函数,所以直接被编译器优化为普通函数,本身这东西只是语法糖,实际是个状态机将函数分为几个步骤干活而已。
@dudu: 花了挺长时间消化,非常感谢