ホームページ >バックエンド開発 >C++ >SynchronizationContext は .NET でスレッドセーフな UI 更新をどのように保証しますか?

SynchronizationContext は .NET でスレッドセーフな UI 更新をどのように保証しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-03 10:16:39262ブラウズ

How Does SynchronizationContext Ensure Thread-Safe UI Updates in .NET?

SynchronizationContext: 特定の場所でのコードの実行

SynchronizationContext は、特定のコンテキストまたは場所でコードを実行する手段を提供します。これは、Send メソッドまたは Post メソッドに渡されたデリゲートをキャプチャし、そのコンテキスト内でそれらを呼び出すことによって機能します。

SynchronizationContext について

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);
});
  1. UI スレッドの SynchronizationContext をキャプチャします: OriginalContext 変数は、新しいタスクを生成する前に UI スレッドの SynchronizationContext をキャプチャします。
  2. バックグラウンド スレッドでタスクを実行: タスクが作成され、スレッド プール ワーカー スレッドで実行されますが、これは通常 UI スレッドではありません。
  3. UI スレッドに戻る: ファイルを読み取った後、コードは、originalContext の Post メソッドを使用して切り替えます。 UI スレッドに戻り、myTextBox.Text を更新するデリゲートを実行します。

UI スレッド アクセスの回避違反

Windows フォームでは、UI コントロールを作成したスレッド以外のスレッドから UI コントロールにアクセスすることは禁止されています。したがって、別のスレッドから UI 要素を操作するときの例外を回避するには、SynchronizationContext を使用して UI スレッドに切り替えることが不可欠です。

代替アプローチ

.NET 4.5 以降、async / await がタスクと組み合わされるようになりました。並列ライブラリ (TPL) を使用すると、特定のコンテキストでコードを実行するプロセスを大幅に簡素化できます。これらの API は、UI スレッドの SynchronizationContext を自動的にキャプチャし、必要に応じてそれに切り替えます。

以上がSynchronizationContext は .NET でスレッドセーフな UI 更新をどのように保証しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。