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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

有没有任何这样的编写方法的场景:

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

提问于
用户回答回答于

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

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

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

用户回答回答于

return在正常的方法和return awaitasync方法的行为不同:当与using(或更广泛地说,任何return awaittry区)。

考虑这两个版本的方法:

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),而第二个版本将运行良好。

扫码关注云+社区