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

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

Patricia Arquette
Patricia Arquetteオリジナル
2025-01-11 21:17:47834ブラウズ

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

スレッドセーフな 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 サイトの他の関連記事を参照してください。

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