.NET の yield
と await
の制御フローを分析する
yield
と await
は、高度な制御フローと非同期プログラミングを可能にする基本的な .NET 機能です。 ただし、その根底にあるメカニズムは複雑になる可能性があります。
await
: 同時実行の調整
スレッド実行とは対照的に、await
は次の手順を通じて制御フローを巧みに管理します。
継続合格スタイルを理解する
await
は「継続通過スタイル」に大きく依存しています。 遭遇すると、タスク完了後のコードの継続を表すデリゲートが生成されます。このデリゲートは次を保持します:
アクティベーション記録の維持
await
でアクティベーション レコード (スタック フレーム) を破棄する代わりに、.NET はそれを巧みにヒープに再配置します。非同期操作は必ずしも厳密なスタックベースの実行パターンに従うわけではないため、これは非常に重要です。
例外処理とスタックの巻き戻し
await
による例外処理は微妙です。 待機中のタスク内の未処理の例外はキャプチャされ、タスクの結果が取得されるときに再スローされます。
yield
とその実行への影響
yield
はイテレーターを定義し、await
と類似点を共有します。イテレータブロック内では、yield
:
yield
ポイントで実行を再開します。yield
await
と同様に、yield
はヒープベースのアクティベーション レコードを使用します。 yield
に遭遇すると、次の MoveNext
呼び出しの命令ポインターを含む現在の状態がヒープに保存されます。
さらなる探索
yield
と await
の詳細な実装を理解するには、ラムダ式のクロージャー クラスを完全に理解することが不可欠です。 Eric Lippert の著作を含む多数のリソースで、.NET メカニズムの詳細な説明が提供されています。
以上が「yield」と「await」は .NET で非同期プログラム フローをどのように制御しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。