.NET の yield
と await
: 非同期制御フローと状態管理をマスターする
yield
と await
は、非同期および反復子の制御フローを簡素化します。 ただし、その基礎となる仕組みは、従来のスタックベースの実行に慣れている開発者にとっては複雑になる可能性があります。
yield
とイテレーター: 状態の保持
反復子ブロック内で、yield
は一時的に制御を呼び出し元に戻します。 後続の呼び出しは、yield
ポイントから実行を再開します。 ランタイムは、反復子の状態 (命令ポインターとローカル変数の値) をスタックではなくヒープに細心の注意を払って保存します。このヒープベースのストレージにより、いつでもシームレスに再開できます。 例外はキャプチャされ、結果の取得時に再スローされます。
await
および非同期操作: 実行の一時停止
await
は return
ステートメントと同様に動作しますが、決定的な違いがあります。非同期操作 (ネットワーク リクエストなど) が完了するまで実行を一時停止します。ランタイムはデリゲートを使用して、再開ポイントやローカル変数の値を含むメソッドの継続を保存します。 このデリゲートは、非同期操作のコールバックとして機能します。結果にアクセスすると、例外が処理されて再スローされます。
スタックの動作: 同時実行
重要なことは、await
は現在の呼び出しスタックを変更しないことです。メソッドの状態はヒープに転送され、アクティブ化レコードがスタックに残っている間、呼び出しメソッドは並行して処理を進めることができます。これにより、ネストされたメソッド呼び出しであってもスタックの上書きが防止されます。
堅牢な例外処理
yield
と await
の両方に、組み込みの例外処理が組み込まれています。 未処理の例外はイテレータまたはタスク内に保存され、後でスローされるため、非同期シナリオでの適切な例外管理が保証されます。
以上が「yield」と「await」は、.NET 非同期操作の制御フローと状態をどのように管理しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。