SynchronizationContext の解読: コードが実行される場所とタイミング
SynchronizationContext は、さまざまな場所でのコード実行の複雑さを理解するのに役立ちます。これは、コード実行の参照点を表します。デリゲートが Send メソッドまたは Post メソッドに割り当てられると、それらは指定された場所で呼び出されます。 Post は非同期処理を提供します。
SynchronizationContext の二重の性質
通常、スレッドは関連付けられた SynchronizationContext を所有します。ただし、このコンテキストは必ずしも特定のスレッドを表すわけではありません。デリゲートの呼び出しをさまざまなスレッド、プロセッサ コア、さらにはリモート ホストに指示できます。採用される SynchronizationContext は実行先を定義します。
Windows フォームでは、初期フォームが作成されるスレッド上に WindowsFormsSynchronizationContext が確立されます。この同期コンテキストにより、デリゲートがそのスレッド上で実行されることが保証されます。 Windows フォームは、他の UI フレームワークと同様に、コントロールの操作をそれを作成したスレッドに制限するため、これは非常に重要です。
SynchronizationContext の役割の説明
次のシナリオを考えてみましょう。
SynchronizationContext originalContext = SynchronizationContext.Current; ThreadPool.QueueUserWorkItem(delegate { string text = File.ReadAllText(@"c:\temp\log.txt"); originalContext.Post(delegate { myTextBox.Text = text; }, null); });
ThreadPool.QueueUserWorkItem に割り当てられたコードスレッド プールのスレッドで実行されます。コンテキストを適切に切り替えないと、myTextBox を操作すると例外が発生します。
これを回避するために、プログラムは Windows フォーム SynchronizationContext をキャプチャし、originalContext に保存します。これにより、後で UI スレッドにコードを「送信」できるようになります。 UI 操作が必要な場合、プログラムはoriginalContext にアクセスし、関連するコードを Send または Post に転送します。
追加の考慮事項
SynchronizationContext は、どのコードが特定の実行を必要とするかを決定しません。場所。フレームワークの要件 (クロススレッド制御アクセスに対する Windows フォーム ルールなど) を理解するのは開発者次第です。
.NET 4.5 以降の場合、async/await キーワードとタスク並列ライブラリ (TPL) を使用します。 ) 同期コンテキストの管理が簡素化されます。これらの機能は、コンテキストのキャプチャ、非同期操作、結果処理のための UI スレッドの再開をシームレスに処理します。
以上がSynchronizationContext はさまざまなコンテキストでコードの実行場所をどのように制御しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。