スレッドセーフな WPF UI 更新: 実践ガイド
WPF アプリケーションでは、バックグラウンド スレッドからの UI 更新を慎重に処理する必要があります。 バックグラウンド スレッドから UI 要素に直接アクセスすることは安全ではなく、アプリケーションが不安定になったりクラッシュしたりする可能性があります。これは、UI 要素が本質的にメイン アプリケーション スレッドにバインドされているためです。
ファイル システム ウォッチャーがログ ファイル エントリを使用してデータ グリッドを更新するシナリオを考えてみましょう。 バックグラウンド スレッド上のウォッチャーのイベント ハンドラー内に新しい行を直接追加しようとすると (例: dataGridRows.Add(ds)
)、正しくありません。
解決策は、Dispatcher
クラスを使用することです。 Dispatcher
は、コード実行をメインスレッドにマーシャリングするメカニズムを提供し、スレッドの安全性を確保します。 Dispatcher.Invoke
メソッドがここで重要です。
watcher_Changed
イベント ハンドラーを変更してデータ グリッドを安全に更新する方法は次のとおりです。
<code class="language-csharp">private void watcher_Changed(object sender, FileSystemEventArgs e) { if (File.Exists(syslogPath)) { string line = GetLine(syslogPath, currentLine); foreach (CommRuleParser crp in crpList) { FunctionType ft = new FunctionType(); if (crp.ParseLine(line, out ft)) { Application.Current.Dispatcher.Invoke(() => DGAddRow(crp.Protocol, ft)); } } currentLine++; } else { MessageBox.Show(UIConstant.COMM_SYSLOG_NON_EXIST_WARNING); } }</code>
Application.Current.Dispatcher.Invoke
を使用すると、メインスレッドでDGAddRow
メソッドが実行されます。これにより、データ グリッドへの安全なアクセスが保証され、スレッドの競合が防止されます。 このアプローチにより、すべての UI 更新が正しく処理され、潜在的なクラッシュや予期しない動作が防止されます。
以上がバックグラウンド スレッドから WPF UI を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。