说我有这样的方法:
private async Task SomeMethod()
{
await DoSomethingAsync();
await DoSomethingElseAsync();
return;
}
鉴于DoSomethingElseAsync
返回a Task
,看来您应该能够做到这一点:
private async Task SomeMethod()
{
await DoSomethingAsync();
return DoSomethingElseAsync();
}
但是编译器对此抱怨:
由于'
SomeMethod
'是返回'Task
'的异步方法,因此return关键字后不能包含对象表达式。您打算返回'Task<T>
'吗?
这是为什么?
它很像是如何yield return
和return
作品。对于迭代器,您可以使用以下两种方法之一
public IEnumerable<int> SomeIterator()
{
for(int I = 0; I < 10; I++) yield return I;
}
public IEnumerable<int> SomeIterator()
{
return Enumerable.Range(0, 10); // return result of another iterator.
}
但是你不能两者兼得。它不起作用,因为迭代器要么由编译器转换为类以使用来处理延迟迭代yield
,要么就像其他返回其他内容的常规方法一样。
public IEnumerable<int> SomeIterator() // not valid
{
for(int I = 0; I < 10; I++) yield return I;
return Enumerable.Range(0, 10);
}
这个故事return
和和一样async/await
。对于返回类型为Task
returnTask
或use的方法async/await
。
因为Task<T>
如果您使用await,则必须返回,T
但Task<T>
由于方法已编译到状态机中而无法返回,因此方法必须返回T
。(因为Task
方法无效)
如果不使用async/await
method,则将与其他常规方法完全一样。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句