首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在C#中“返回等待”的目的是什么?

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

Stack Overflow用户
提问于 2013-09-30 23:30:36
回答 7查看 51.3K关注 0票数 294

有没有像这样写方法的场景:

代码语言:javascript
复制
public async Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return await DoAnotherThingAsync();
}

而不是这样:

代码语言:javascript
复制
public Task<SomeResult> DoSomethingAsync()
{
    // Some synchronous code might or might not be here... //
    return DoAnotherThingAsync();
}

会有意义吗?

当您可以直接从内部return await Task<T> 调用返回return await时,为什么要使用构造?

我在很多地方看到使用return await的代码,我想我可能遗漏了一些东西。但据我所知,在这种情况下不使用async/await关键字和直接返回Task在功能上是等效的。为什么要增加额外的await层开销?

EN

回答 7

Stack Overflow用户

发布于 2013-10-01 04:35:50

当普通方法中的returnasync方法中的return await表现不同时,有一种不为人知的情况:当与using (或者,更一般地,与try块中的任何return await )结合使用时。

考虑以下两个版本的方法:

代码语言:javascript
复制
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()操作,这很可能是在它实际完成之前很久的事情。这意味着第一个版本可能有buggy (因为Foo处理得太快了),而第二个版本可以很好地工作。

票数 220
EN

Stack Overflow用户

发布于 2013-09-30 23:35:07

如果你不需要async (也就是,你可以直接返回Task ),那么就不要使用async

在某些情况下,return await很有用,比如您有两个异步操作要做:

代码语言:javascript
复制
var intermediate = await FirstAsync();
return await SecondAwait(intermediate);

有关async性能的更多信息,请参阅有关该主题的Stephen Toub的MSDN articlevideo

更新:我已经写了一个更详细的blog post

票数 113
EN

Stack Overflow用户

发布于 2013-09-30 23:35:37

你想这样做的唯一原因是如果在前面的代码中有一些其他的await,或者如果你在返回结果之前以某种方式操作它。另一种可能发生这种情况的方式是通过改变异常处理方式的try/catch。如果你没有做任何这样的事情,那么你是对的,没有理由增加使方法成为async的开销。

票数 24
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19098143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档