SynchronizationContext は、コードが実行される場所を表す「実行場所」として知られる概念を具体化しています。 Post メソッドまたは Send メソッドに渡されたデリゲートは、その場所内で呼び出されます。
すべてのスレッドが専用の SynchronizationContext を持つことができますが、このコンテキストは必ずしも特定のスレッドを表すわけではありません。 SynchronizationContext は、デリゲートの呼び出しをさまざまなスレッド、または他の CPU コアやリモート ホストなどの異なる実行環境にルーティングすることができます。具体的な動作は、実装された SynchronizationContext によって異なります。
Windows Forms は、初期フォームが作成されるスレッド (一般に「UI スレッド」と呼ばれます) で WindowsFormsSynchronizationContext を初期化します。この SynchronizationContext は、元のスレッドでコントロールを操作するというフレームワークの要件に従って、すべての UI 関連のコードがそのスレッド上で実行されることを保証します。
提供されているコード サンプルは、その使用法を示しています。 Post メソッドの。 ThreadPool.QueueUserWorkItem は、ワーカー スレッドで提供されたデリゲートを実行します。このデリゲート内で、Post メソッドは、前にキャプチャした WindowsFormsSynchronizationContext を使用して、myTextBox コントロールを操作するコードを UI スレッドに送り返します。これは、UI スレッドがコントロールの変更を安全に処理するために必要です。
If the myTextBox.Text = text;ステートメントがスレッド プール ワーカー スレッド デリゲート内で直接実行された場合、例外が発生します。 Windows フォームでは、コントロールの操作はコントロールが作成されたのと同じスレッドで実行する必要があります。 SynchronizationContext を利用することで、コードは UI の安全な対話を保証します。
SynchronizationContext は、特定の場所でどのコードを実行するかを自動的に決定しません。コードを適切に実行するには、フレームワークの要件を理解することが重要です。 Windows フォームの場合、非 UI スレッドからコントロールにアクセスしないようにすることが重要です。 .NET 4.5 以降では、async/await とタスク並列ライブラリにより、非同期操作を調整し、結果処理のために UI スレッドに戻るための簡略化されたメカニズムが提供されます。
以上がSynchronizationContext は UI インタラクションにおけるスレッドの安全性をどのように確保しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。