有没有像这样写方法的场景:
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>
调用返回return await
时,为什么要使用构造?
我在很多地方看到使用return await
的代码,我想我可能遗漏了一些东西。但据我所知,在这种情况下不使用async/await关键字和直接返回Task在功能上是等效的。为什么要增加额外的await
层开销?
发布于 2013-10-01 04:35:50
当普通方法中的return
和async
方法中的return await
表现不同时,有一种不为人知的情况:当与using
(或者,更一般地,与try
块中的任何return await
)结合使用时。
考虑以下两个版本的方法:
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
处理得太快了),而第二个版本可以很好地工作。
发布于 2013-09-30 23:35:07
如果你不需要async
(也就是,你可以直接返回Task
),那么就不要使用async
。
在某些情况下,return await
很有用,比如您有两个异步操作要做:
var intermediate = await FirstAsync();
return await SecondAwait(intermediate);
有关async
性能的更多信息,请参阅有关该主题的Stephen Toub的MSDN article和video。
更新:我已经写了一个更详细的blog post。
发布于 2013-09-30 23:35:37
你想这样做的唯一原因是如果在前面的代码中有一些其他的await
,或者如果你在返回结果之前以某种方式操作它。另一种可能发生这种情况的方式是通过改变异常处理方式的try/catch
。如果你没有做任何这样的事情,那么你是对的,没有理由增加使方法成为async
的开销。
https://stackoverflow.com/questions/19098143
复制相似问题