有没有这样的写作方法:
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();
}
有意义吗?
为什么使用返回等待构造时,你可以直接返回任务<T>从内部DoAnotherThingAsync()调用?
我在很多地方看到等待返回的代码,我想我可能错过了一些东西。但据我所知,在这种情况下不使用async/await关键字,直接返回任务在功能上是等效的。为什么要增加额外等待层的额外开销?
您可能希望返回await的另一个原因是:await语法允许您避免遇到Task<T>和ValueTask<T>类型之间的不匹配。例如,下面的代码即使SubTask方法返回Task<T>,但它的调用者返回ValueTask<T>。
async Task<T> SubTask()
{
...
}
async ValueTask<T> DoSomething()
{
await UnimportantTask();
return await SubTask();
}
如果你跳过DoSomething()行上的await,你会得到一个编译器错误CS0029:
不能隐式转换类型` System.Threading.Tasks。Task<BlaBla>'到'System.Threading.Tasks.ValueTask<BlaBla>'。
如果您尝试显式地类型转换它,也会得到CS0030。
顺便说一下,这是。net框架。我完全可以预见到一个评论说“这在。net的hypothetical_version中是固定的”,我还没有测试它。:)
您可能希望返回await的另一个原因是:await语法允许您避免遇到Task<T>和ValueTask<T>类型之间的不匹配。例如,下面的代码即使SubTask方法返回Task<T>,但它的调用者返回ValueTask<T>。
async Task<T> SubTask()
{
...
}
async ValueTask<T> DoSomething()
{
await UnimportantTask();
return await SubTask();
}
如果你跳过DoSomething()行上的await,你会得到一个编译器错误CS0029:
不能隐式转换类型` System.Threading.Tasks。Task<BlaBla>'到'System.Threading.Tasks.ValueTask<BlaBla>'。
如果您尝试显式地类型转换它,也会得到CS0030。
顺便说一下,这是。net框架。我完全可以预见到一个评论说“这在。net的hypothetical_version中是固定的”,我还没有测试它。:)