私は次のように設定しています:
class mytype
{
Awaiter GetAwaiter() { ... }
}
class Awaiter : INotifyCompletion
{
bool IsCompleted { get { return false; } }
void GetResult () { }
void OnCompleted(Action continuation)
{
//that's the continuation in focus
}
}
//somewhere else:
async Task MyMethod()
{
//here instructions for 1st state
await new mytype();
//here instructions for 2nd state
await new mytype();
//here instructions for 3rd state
}
私は間違っていますか、それとも CLR から取得したデリゲート (同じメソッド内) は常に多かれ少なかれ同じデリゲートですが、待っているインスタンスは異なりますか? C# コンパイラは、async キーワードのために MyMethod を 3 つの状態を持つ FSM に変換します。そして、C# のメソッドで何かを待機するたびに、内部的に FSM の MoveNext メソッドが呼び出されます。しかし、FSM は状態自体を追跡しているため、最後の状態を認識しているため、次の状態に進む (そして新しい状態に関連付けられた命令を実行する) ことができます。
したがって、本質的には、継続という名前のデリゲートの Invoke は、適切な FSM-Type の MoveNext メソッドの呼び出しに内部的に帰着することを理解しています。大した魔法ではないように思えます - それとも私は間違っていますか?