SynchronizationContext は、コードの実行を管理する上で重要な役割を果たし、さまざまなコンテキスト内でコードが適切に配置されるようにします。その機能を解明し、その使用法と重要性についての質問に答えてみましょう。
本質的に、SynchronizationContext はコードの実行が発生する場所を表します。 Send や Post などのメソッドに渡されたデリゲートは、この指定された場所で呼び出されます。各スレッドには、SynchronizationContext.Current プロパティを通じてアクセスできる、関連付けられた SynchronizationContext を持つことができます。
Windows フォームでは、最初のフォームを作成するスレッドに関連付けられた WindowsFormsSynchronizationContext が使用されます。この特定のコンテキストにより、UI 要素を操作するコードなど、それに渡されたデリゲートがその正確なスレッドで実行されることが保証されます。 Windows フォーム API は、コントロールの操作をコントロールを作成したスレッドに制限するため、これは重要になります。
コード スニペットを調べてみましょう:
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 を更新するには、myTextBox が存在する UI スレッドに戻る必要があります。 Windows フォームの SynchronizationContext をoriginalContext でキャプチャし、それを使用して UI 操作のコードを Post に渡します。これにより、myTextBox.Text の割り当てが適切なスレッドで確実に行われるようになります。
myTextBox.Text = text; を実行した場合。ワーカー スレッド上で直接実行すると、Windows フォームは最終的に例外を発生させ、コントロールへのクロススレッド アクセスを妨げます。 SynchronizationContext を使用すると、このギャップを埋めることができます。
SynchronizationContext を使用すると、さまざまなスレッド間でコードの実行を調整し、スレッドの安全性とフレームワーク要件の遵守を確保できます。これは多用途のツールですが、作業している特定のコンテキストとコントロール操作の適切なガイドラインを理解することが不可欠です。
以上がSynchronizationContext はマルチスレッド アプリケーションでスレッドの安全性をどのように確保しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。