异步等待无限回归

时间:2014-01-07 05:08:20

标签: c#

您只能等待异步方法。但是,异步方法本身需要在其内部具有await语句。 这不会导致无限回归吗?

2 个答案:

答案 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()方法的内容,其返回类型具有适当的IsCompletedGetResult()OnCompleted()成员。< / p>

请注意,即使您正在等待调用异步方法的结果,也就是您正在等待的结果 ...并且结果发生来自异步方法。就编译器而言,您只是在等待TaskTask<T>,这是方法调用的结果。 async部分在方法的实现中很重要。

您可以等待其他事情 - 例如,Task.Yield返回YieldAwaitable这不是任务,但实现了等待模式。您可以自己实施等待模式(如果您愿意,可以通过这样做引起各种有趣的混乱)。

  

然而,异步方法本身需要在其自身内部有一个await语句。

同样,不是真的 - 尽管如果在异步方法中有await表达式,编译器会发出警告,因为这几乎总是表明你做错了。< / p>