ホームページ >バックエンド開発 >C++ >バックグラウンド スレッドから WPF UI 要素を安全に更新するにはどうすればよいですか?

バックグラウンド スレッドから WPF UI 要素を安全に更新するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2025-01-11 21:11:42693ブラウズ

How Can I Safely Update WPF UI Elements from a Background Thread?

WPF の UI (メイン) スレッドへの安全なアクセス

WPF アプリケーションでは、非 UI スレッド (バックグラウンド スレッドなど) から UI スレッドと対話すると、例外やクラッシュが発生する可能性があります。これは、UI スレッドには UI の更新を管理し、スレッドの安全性を確保するスケジューラがあるためです。

質問:

ログ ファイルが変更されたときに DataGrid を更新する次のコードについて考えてみましょう。

<code class="language-c#">private void watcher_Changed(object sender, FileSystemEventArgs e)
{
    if (File.Exists(syslogPath))
    {
        ...
        DGAddRow(crp.Protocol, ft);
    }
}</code>

DGAddRow メソッドは DataGrid に新しい行を追加します。これは UI スレッドで行う必要があります。ただし、watcher_Changed はバックグラウンド スレッドで実行されるため、UI を直接変更しようとし、例外が発生します。

解決策:

UI スレッドに安全にアクセスするには、Application または任意の UIElement の Dispatcher.Invoke メソッドを使用します。このメソッドを使用すると、UI スレッドでコードを実行できます。

<code class="language-c#">Application.Current.Dispatcher.Invoke(new Action(() => {
    DGAddRow(crp.Protocol, ft);
}));</code>

Dispatcher.Invoke を使用すると、UI を更新するコードがメインスレッドで実行されるため、潜在的なスレッド問題が回避されます。

以上がバックグラウンド スレッドから WPF UI 要素を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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