Async/Await FAQで、Stephen Toub は次のように述べています。
awaitableは、有効なawaiter
GetAwaiterを返すメソッドを公開する任意の型です。
...
awaiterはawaitableのメソッドから返される任意の型であり、特定のパターンに準拠します。GetAwaiter
したがって、awaiterになるためには、タイプは次のようにする必要があります。
- インターフェイスを実装し
INotifyCompletionます。 - というブール値のプロパティを提供します
IsCompleted。 - または
GetResultを返すパラメータなしのメソッドを提供します。voidTResult
(今は無視しICriticalNotifyCompletionています。 )
私が言及したページには、コンパイラが await 操作をどのように変換するかを示すサンプルがあることは知っていますが、まだ理解するのに苦労しています。
私がawaitableを待っているとき、
- いつ
IsCompletedチェックされますか?どこに設定すればよいですか? - いつ
OnCompleted呼ばれますか? - どのスレッドが を呼び出し
OnCompletedますか? - の継続パラメーターを直接呼び出す例と、さまざまな例で
OnCompleted使用する例を見ました。Task.Run(continuation)