为什么没有 IAwaitable 和 IAwaiter 接口

Ack*_*ari 5 c# language-design async-await

我最近了解了自定义可等待类型的可能性,正如这个问题和Stephen Toub所说,要成为可等待类型有几个要求。

所以如果一个类型T想要等待它必须

  • 公开一个GetAwaiter返回有效等待者的无参数方法

如果一个类型A想成为一个有效的等待者,它必须

  • 实现INotifyCompletion接口
  • 提供一个名为的布尔属性 IsCompleted
  • 提供一个无参数的GetResult方法,返回voidTResult

所以现在我要问的是,如果所有这些都需要成为可等待类型,为什么某些接口的那部分不是像

public interface INotifyCompletion
{
    bool IsCompleted { get; }
    void OnCompleted(Action continuation);
}

public interface IAwaiter : INotifyCompletion
{
    void GetResult();
}

public interface IAwaitable<TAwaiter> where TAwaiter : IAwaiter
{
    TAwaiter GetAwaiter();
}

public interface IAwaiter<TResult> : INotifyCompletion
{
    TResult GetResult();
}

// this would probably not necessary but would likely help to identify
// awaitables that return a value
public interface IAwaitable<TAwaiter, TResult> where TAwaiter : IAwaiter<TResult>
{
    TAwaiter GetAwaiter();
}
Run Code Online (Sandbox Code Playgroud)

我也明白编译器不需要它,因为它可以在编译时检查所有这些而不会受到任何惩罚。但是既然有方法的INotifyCompletion接口,那么OnCompleted()为什么等待者和等待者的接口的其余部分没有打包在某些接口中呢?

这很可能有助于告知程序员如何实现这一点。

我也知道可以通过提供一个返回有效等待者的扩展方法来使类型成为可等待的,但同样为什么等待者的整个接口不是打包在单个接口中而是有漏洞(即该IsCompleted属性不是任何的一部分)接口但需要)?

mjw*_*lls 3

IAwaiterIAwaitable如果你想使用它们,接口也是可用的。

请注意,它们不是强制使用的,但如果您觉得它们会让您的生活更轻松 - 请随意使用它们。

这篇博文也值得一读。