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