Task 或 Task<TResult> 对象是可等待的,因此我们可以对返回值为 Task 或 Task<TResult> 的对象使用 await 键。Task 或 Task<TResult> 是最常用的可等待对象。
我们也可以定义自己的等待对象。该对象应具有以下条件。
- 它有一个 GetAwaiter() 方法(实例方法或扩展方法);
- 它的 GetAwaiter() 方法返回一个等待者。一个对象是一个等待者,如果:
- 它实现了 INotifyCompletion 或 ICriticalNotifyCompletion 接口;
- 它有一个 IsCompleted,它有一个 getter 并返回一个布尔值;
- 它有一个 GetResult() 方法,该方法返回 void 或结果。
我的问题是,为什么微软没有提供一个接口来约束这些等待对象?当前实现等待对象的方法有点复杂。