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

在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层?


qq_笑_17
浏览 506回答 3
3回答

波斯汪

有一个偷偷摸摸的案子return在正常的方法和return await在……里面async方法的行为不同:当与using(或更广泛地说,任何return await在.try街区)。考虑这两个版本的方法:Task<SomeResult>&nbsp;DoSomethingAsync(){ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;foo&nbsp;=&nbsp;new&nbsp;Foo()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;foo.DoAnotherThingAsync(); &nbsp;&nbsp;&nbsp;&nbsp;}}async&nbsp;Task<SomeResult>&nbsp;DoSomethingAsync(){ &nbsp;&nbsp;&nbsp;&nbsp;using&nbsp;(var&nbsp;foo&nbsp;=&nbsp;new&nbsp;Foo()) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;await&nbsp;foo.DoAnotherThingAsync(); &nbsp;&nbsp;&nbsp;&nbsp;}}第一种方法是Dispose()这个Foo对象的DoAnotherThingAsync()方法返回,这很可能在实际完成之前很久。这意味着第一个版本可能是错误的(因为Foo),而第二个版本将运行良好。

肥皂起泡泡

如果你不需要async(即,您可以返回Task),那么不要使用async.有些情况下return await是有用的,就像你有二要执行的异步操作:var&nbsp;intermediate&nbsp;=&nbsp;await&nbsp;FirstAsync();return&nbsp;await&nbsp;SecondAwait(intermediate);欲了解更多信息async性能,见StephenToub‘sMSDN文章和视频关于这个话题。最新情况:我写了一个博客帖子这就涉及到了更多的细节。

跃然一笑

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