我通过提供以下四个实例成员实现了我自己的等待类型:
public bool IsCompleted { get; }
public void OnCompleted(Action continuation);
public AwaitResult GetResult();
public object GetAwaiter();
因为这是所有编译器都要求我接受
MyAwaitableType obj = new MyAwaitableType();
await obj;
我用
标记了所有这些标记[Obsolete("Do not use in code.", true)]
因此,无论何时从代码调用任何成员而不是使用await,都会导致生成错误。在这种情况下使用Obsolete-Attribute不是它的预期方式 - 但我不知道更好的方法(如果有更好的解决方案,我很想听到更好的解决方案),但它在Visual中包含的C#编译器中运行良好Studio 2012。
我在Visual Studio 2015中打开了解决方案,似乎C#编译器有点挑剔,因为它抱怨GetAwaiter方法的过时并在await obj
语句下面显示曲折。
摆脱错误很容易,但我很想知道为什么编译器现在以常规方式访问GetAwaiter方法,而不是在Visual Studio 2012中进行(可能是反射?)。我的理解是,类型是否可以等待是基于模式匹配(存在与否的四个必需成员)而不是基于接口实现的问题。