在Async/Await FAQ中,Stephen Toub 说:
awaitable是公开返回有效 awaiter 的方法的任何类型。 ... awaiter是从awaitable的方法返回的任何类型,并且符合特定模式。
GetAwaiter
GetAwaiter
所以为了成为一个awaiter,一个类型应该:
- 实现
INotifyCompletion
接口。 - 提供一个名为 的布尔属性
IsCompleted
。 - 提供一个返回or的无参数
GetResult
方法。void
TResult
(我暂时忽略ICriticalNotifyCompletion
。)
我知道我提到的页面有一个示例,该示例显示了编译器如何翻译等待操作,但我仍然很难理解。
当我等待一个awaitable时,
- 什么时候
IsCompleted
检查?我应该在哪里设置它? - 什么时候
OnCompleted
调用? - 哪个线程调用
OnCompleted
? - 我看到了直接调用 continuation 参数
OnCompleted
和Task.Run(continuation)
在不同示例中使用的示例,我应该选择哪个,为什么?