首页 > 解决方案 > 为什么没有 IAwaitable 和 IAwaiter 接口

问题描述

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

因此,如果一个类型T想要等待它,它必须

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

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

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();
}

我也明白编译器不需要它,因为它可以在编译时检查所有这些而不会受到任何惩罚。但是既然有方法的INotifyCompletion接口OnCompleted(),为什么不把剩下的用于等待对象和等待者的接口打包在一些接口中呢?

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

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

标签: c#async-awaitlanguage-design

解决方案


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

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

这篇博文可能也值得一读。


推荐阅读