为了账号安全,请及时绑定邮箱和手机立即绑定

在C#中“回程等待”的目的是什么?

在C#中“回程等待”的目的是什么?

qq_笑_17 2019-06-06 15:23:59
在C#中“回程等待”的目的是什么?在那里吗任何这样编写方法的场景:public async Task<SomeResult> DoSomethingAsync(){     // Some synchronous code might or might not be here... //     return await DoAnotherThingAsync();}而不是这样:public Task<SomeResult> DoSomethingAsync(){     // Some synchronous code might or might not be here... //     return DoAnotherThingAsync();}会有意义吗?为什么使用return await构造可以直接返回的Task<T>从内部DoAnotherThingAsync()召唤?我看到代码return await在很多地方,我想我可能错过了什么。但据我所知,在这种情况下不使用异步/等待关键字并直接返回任务在功能上是等价的。为什么要增加额外的开销await层?
查看完整描述

3 回答

?
波斯汪

TA贡献1811条经验 获得超4个赞

有一个偷偷摸摸的案子return在正常的方法和return await在……里面async方法的行为不同:当与using(或更广泛地说,任何return await在.try街区)。

考虑这两个版本的方法:

Task<SomeResult> DoSomethingAsync(){
    using (var foo = new Foo())
    {
        return foo.DoAnotherThingAsync();
    }}async Task<SomeResult> DoSomethingAsync(){
    using (var foo = new Foo())
    {
        return await foo.DoAnotherThingAsync();
    }}

第一种方法是Dispose()这个Foo对象的DoAnotherThingAsync()方法返回,这很可能在实际完成之前很久。这意味着第一个版本可能是错误的(因为Foo),而第二个版本将运行良好。


查看完整回答
反对 回复 2019-06-06
?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

如果你不需要async(即,您可以返回Task),那么不要使用async.

有些情况下return await是有用的,就像你有要执行的异步操作:

var intermediate = await FirstAsync();return await SecondAwait(intermediate);

欲了解更多信息async性能,见StephenToub‘sMSDN文章视频关于这个话题。

最新情况:我写了一个博客帖子这就涉及到了更多的细节。


查看完整回答
反对 回复 2019-06-06
?
跃然一笑

TA贡献1826条经验 获得超6个赞

你想这么做的唯一原因是如果有别的await在前面的代码中,或者在返回结果之前以某种方式操作结果。另一种可能发生这种情况的方式是通过try/catch这会改变异常的处理方式。如果您没有这样做,那么您是对的,没有理由增加创建该方法的开销async.


查看完整回答
反对 回复 2019-06-06
  • 3 回答
  • 0 关注
  • 505 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信