SynchronizationContext は、特定のコンテキストまたは場所でコードを実行する手段を提供します。これは、Send メソッドまたは Post メソッドに渡されたデリゲートをキャプチャし、そのコンテキスト内でそれらを呼び出すことによって機能します。
SynchronizationContext は、各スレッド内に存在するクラスであり、SynchronizationContext.SetSynchronizationContext を介して設定できます。または SynchronizationContext.Current 経由でアクセスします。ただし、SynchronizationContext は必ずしも特定のスレッドを表すわけではなく、さまざまなスレッドやリモート ホストに呼び出しを委任できることに注意してください。
Windows フォームでは、最初のフォームが作成されるときに、WindowsFormsSynchronizationContext が UI スレッドにインストールされます。作成されました。このコンテキストにより、Send または Post に渡されたデリゲートが UI スレッドで確実に呼び出されます。これは、Windows フォーム コントロールの操作に重要です。
提供されたサンプル コードは、SynchronizationContext の使用方法を示しています。別のコントロールから UI コントロールを操作するにはthread:
SynchronizationContext originalContext = SynchronizationContext.Current; ThreadPool.QueueUserWorkItem(delegate { string text = File.ReadAllText(@"c:\temp\log.txt"); originalContext.Post(delegate { myTextBox.Text = text; }, null); });
Windows フォームでは、UI コントロールを作成したスレッド以外のスレッドから UI コントロールにアクセスすることは禁止されています。したがって、別のスレッドから UI 要素を操作するときの例外を回避するには、SynchronizationContext を使用して UI スレッドに切り替えることが不可欠です。
.NET 4.5 以降、async / await がタスクと組み合わされるようになりました。並列ライブラリ (TPL) を使用すると、特定のコンテキストでコードを実行するプロセスを大幅に簡素化できます。これらの API は、UI スレッドの SynchronizationContext を自動的にキャプチャし、必要に応じてそれに切り替えます。
以上がSynchronizationContext は .NET でスレッドセーフな UI 更新をどのように保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。