![]() |
1
netnr 1 天前
|
![]() |
3
geelaw 1 天前
楼主应该善待帮助自己的人,比如提供格式化之后的代码。
TestController 里面的代码没什么意思上的差别,Get1Async 没有额外包装,或许性能会好一些。 TsetService (维持楼主的错误拼写)里面则完全不同。 Get1Async 完全抛弃了 Task.Delay(100),所以 Get1Async 实际上没有任何延迟,return Task.FromResult 是同步执行的,await Get1Async() 也不会有延迟,因为被 await 对象是已经完成的 Task.FromResult 。 await Get2Async() 有 100ms 延迟。 |
![]() |
4
geelaw 1 天前
@geelaw #3 所谓没有意思上的差别,是指假设有
Task<T> M(); 那么 Task<T> M1() { return M(); } async Task<T> M2() { return await M(); } 没什么区别,当然 TestController 里面 Get1Async, Get2Async 因为调用了 TsetService 里面不同的方法,实际的效果区别很大。 |
5
csys 1 天前
https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md?utm_source=csharpdigest&utm_medium&utm_campaign=286#prefer-asyncawait-over-directly-returning-task
简单来说,如果你的整个方法内部没有任何别的事情要做,就是单独一个 Task ,那么你直接 return 而非 await 这个 task ,可以避免 C#生成一个异步状态机,从而轻微避免了一些性能负担 我的经验里,这种场景非常少,实际上,一个方法的所有职责仅仅是为了调用另一个方法,本身就是一种代码坏味道 |
6
jmliubiao OP |
![]() |
8
geelaw 1 天前
@jmliubiao #6 oh wow 你应该看 #5 的信息,我记错了……
TestController 代码的效果只有无异常的情况下是一样的,考虑 new TsetService() 这个表达式产生异常的情况(比如内存不足,或者构造器抛出异常),那么 Get1Async 会同步得到异常,而 Get2Async 会把异常装进 Task<Student> 里面返回。 Task<int> M1(bool t) { if (t) throw new Exception(); return Task.FromResult(0); } async Task<int> M2(bool t) { if (t) throw new Exception(); return 1; } 那么 try { M1(); } catch(Exception ex) { Console.WriteLine("caught M1"); } M2(); Console.WriteLine("M2 succeeded"); 的结果是 caught M1 M2 succeeded 因为 M2 的异常只有在 await 的时候才会浮现。但是 #5 说由于这个(异常总是异步的)优点所以应该尽量用 async/await 我就不知道了,我的感觉是最终使用的时候所有 Task 都要被 await ,此时包围之的方法必然是 async ,因此同步异常和异步异常最后都会浮现,时机不同,而且典型的代码里还会掺杂很多其他可能异常的语句,就看细抠异常语义是否有意义吧。 |
9
i8086 1 天前
这个例子问题其实不大。
如果 Get1Async() 方法 Task.Delay(100) 被替换为一组耗时的数据库操作。 asp.net 请求结束后,对象会被释放。 如果异步操作还没跑完,可能会引发 ObjectDisposedException 异常。 而且这么写,数据库操作这块出错,也可能抓取不到异常。 |
10
seleningchan1 1 天前
还有 C#的岗位吗
|
11
jmliubiao OP @seleningchan1 上位机还是有的。
|