[AsyncMethodBuilder(typeof(MyTaskBuilder))]
public class MyTask
{
public static MyTask Run(Action action) { }
public MyTaskAwaiter GetAwaiter() { }
}
public class MyTaskAwaiter : INotifyCompletion
{
public bool IsCompleted { get; }
public void GetResult() { }
public void OnCompleted(Action continuation) { }
}
Generalized async return types部分中的描述
@Grundy 的回答和@Qutrix的评论的一个小补充:
为了让编译器允许您使用自己的类任务类型作为异步方法的返回值,您必须执行以下操作:
创建此类型。它可以是类或结构:
[AsyncMethodBuilder(typeof(MyTaskBuilder))]MyTaskBuilder。将来,编译器将使用它来构造您的类任务类型(最小方法和属性集如下所示,并且必须存在于定义中MyTaskBuilder)await,还需要在类中实现一个MyTask公共方法,该方法GetAwaiter()的返回类型 (MyTaskAwaiter) 必须实现接口INotifyCompletion,具有公共属性IsCompleted,当然还有方法GetResult()(将返回结果异步操作或无效)。因此我们能够写出类似的东西
一般情况下是正确的,但有一点修正:当任务有可能在不中断执行的情况下完成时。或者,等价地,如果它可以同步执行。这与不调用 await 不同,因为如果在已完成的任务上调用 await 运算符,它不会中断方法的执行。
例如,下面的方法将被同步执行: