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 サイトの他の関連記事を参照してください。