c# - 为什么没有 IAwaitable 和 IAwaiter 接口
问题描述
我最近了解到有自定义等待类型的可能性,正如这个问题和Stephen Toub所说,成为等待类型有几个要求。
因此,如果一个类型T
想要等待它,它必须
- 公开一个
GetAwaiter
返回有效等待者的无参数方法
如果一个类型A
想要成为一个有效的等待者,它必须
- 实现
INotifyCompletion
接口 - 提供一个名为的布尔属性
IsCompleted
- 提供返回或返回的无参数
GetResult
方法void
TResult
所以现在我要问是否所有这些都需要成为可等待类型,为什么某些接口的那部分不是
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++ - 同时写入内存中的一个字节
- c++ - 升级到 1.72.0 后 Boost 构建失败 - 两次相同的目标
- xslt-2.0 - format-number() 带有图片字符串 '#.##'
- bash - 如何将多个文件的内容附加到单个文件?
- c++ - 传递给另一个函数时获取数组的长度
- jquery - 如何在 n 秒后重试 AJAX 循环 n 次?
- windows - 尽管设置了 ImagePullPolicy=Never,但无法使用 kubectl 和 minikube 启动 pod
- python - 在 Python 中的函数之间返回
- karate - 空手道 - 无法与 pkcs12 密钥库和密码建立连接
- java - 来自 Java 服务的间歇性 UnknownHostException 的根本原因?