您只能等待异步方法。但是,异步方法本身需要在其内部具有await语句。 这不会导致无限回归吗?
答案 0 :(得分:3)
没有几个原因
async
方法不需要await
,只是推荐await
表达式可以定位Task<T>
async
方法
这是一个终止的简单示例
async Task<int> Add(Task<int> task, int value) {
var t = await task;
return t + value;
}
Task<int> t;
Task<int> t2 = Add(t, 42);
答案 1 :(得分:2)
您只能等待异步方法。
那不是真的。您可以等待“等待模式”之后的任何内容(具有GetAwaiter()
方法的内容,其返回类型具有适当的IsCompleted
,GetResult()
和OnCompleted()
成员。< / p>
请注意,即使您正在等待调用异步方法的结果,也就是您正在等待的结果 ...并且结果发生来自异步方法。就编译器而言,您只是在等待Task
或Task<T>
,这是方法调用的结果。 async
部分仅在方法的实现中很重要。
您可以等待其他事情 - 例如,Task.Yield
返回YieldAwaitable
这不是任务,但实现了等待模式。您可以自己实施等待模式(如果您愿意,可以通过这样做引起各种有趣的混乱)。
然而,异步方法本身需要在其自身内部有一个await语句。
同样,不是真的 - 尽管如果不在异步方法中有await表达式,编译器会发出警告,因为这几乎总是表明你做错了。< / p>