.NET フロー制御: yield
と await
yield
と await
は、高度な制御フローを可能にし、同時実行性をシミュレートする基本的な .NET キーワードです。 ただし、その根底にあるメカニズムを理解するには、慎重な調査が必要です。この記事では、その機能について説明します。
await
の制御フロー メカニズム
await
に遭遇すると、次のランタイム アクションがトリガーされます:
await
は継続デリゲートをアタッチし、後で実行を再開します。継続データの管理
await
によって生成された継続デリゲートには次のものが含まれます:
このデータはヒープ上に存在し、通常のスタックのアクティブ化シーケンス以外でもアクセス可能です。
コールスタックの保存
標準のコールスタックとは異なり、重要なアクティベーションレコード情報は最初にヒープに割り当てられます。発信者のアクティブ化レコードは、await
.
yield
およびイテレーター状態管理
yield
は、await
と同様に機能します。 yield
に遭遇すると、ローカル状態は次の MoveNext
実行のための命令ポインターとともにヒープに移動されます。 例外処理はイテレータ ブロックの内部管理に統合されています。
例外処理戦略
キャッチされなかった例外はタスク内でキャプチャされ、タスクの結果にアクセスしたときに再スローされます。
概要
yield
と await
の複雑さは、継続渡しスタイル (CPS) への依存から生じます。 ランタイムは、アクティベーション情報を戦略的にヒープにオフロードし、制御フローとイテレーターの状態を維持します。 await
を使用したラムダ式を理解することは重要ですが、yield
、イテレーター、および非同期プログラミングに関する Eric Lippert のブログ投稿で詳しく説明されているように、CPS をさらに詳しく調べると、より深い理解が得られます。
以上が.NET で「yield」と「await」を使用してフロー制御を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。