5
どのように.NETで制御フローを実装して待機するのですか?
yieldキーワードを理解しているように、イテレーターブロック内から使用すると、制御のフローが呼び出し元のコードに戻り、イテレーターが再度呼び出されると、中断したところから再開されます。 また、await呼び出し先を待つだけでなく、呼び出し元に制御を戻し、呼び出し元が中断したところから再開するawaitsがメソッドをたます。 つまり、スレッドはありません。、非同期との「並行性」は、巧妙な制御の流れによって引き起こされる幻想であり、その詳細は構文によって隠されています。 現在、私は以前のアセンブリプログラマであり、命令ポインタやスタックなどに精通しており、通常の制御フロー(サブルーチン、再帰、ループ、分岐)がどのように機能するかを理解しています。しかし、これらの新しい構成要素-私はそれらを取得しません。 にawait到達すると、ランタイムはどのコードが次に実行する必要があるかをどのようにして知るのでしょうか?いつ中断したところから再開できるか、どのようにしてそれをどこで覚えているか?現在のコールスタックはどうなりますか?どういうわけか保存されますか?呼び出し元のメソッドがそれより前に他のメソッド呼び出しを行うとawaitどうなりますか?スタックが上書きされないのはなぜですか?そして、例外が発生してスタックが解放された場合、ランタイムはどのようにしてこれらすべてを処理しますか? yield到達したとき、ランタイムは、物事をピックアップする必要があるポイントをどのように追跡しますか?イテレータの状態はどのように保存されますか?