Ack*_*ari 5 c# language-design async-await
我最近了解了自定义可等待类型的可能性,正如这个问题和Stephen Toub所说,要成为可等待类型有几个要求。
所以如果一个类型T想要等待它必须
GetAwaiter返回有效等待者的无参数方法如果一个类型A想成为一个有效的等待者,它必须
INotifyCompletion接口IsCompletedGetResult方法,返回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();
}
Run Code Online (Sandbox Code Playgroud)
我也明白编译器不需要它,因为它可以在编译时检查所有这些而不会受到任何惩罚。但是既然有方法的INotifyCompletion接口,那么OnCompleted()为什么等待者和等待者的接口的其余部分没有打包在某些接口中呢?
这很可能有助于告知程序员如何实现这一点。
我也知道可以通过提供一个返回有效等待者的扩展方法来使类型成为可等待的,但同样为什么等待者的整个接口不是打包在单个接口中而是有漏洞(即该IsCompleted属性不是任何的一部分)接口但需要)?