ホームページ >バックエンド開発 >C++ >非メインスレッドから WPF コントロールを安全に更新するにはどうすればよいですか?

非メインスレッドから WPF コントロールを安全に更新するにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-17 14:17:13329ブラウズ

How Can I Safely Update WPF Controls from a Non-Main Thread?

Dispatcher.Invoke()

によるスレッドセーフな WPF UI の更新

WPF アプリケーションでは、長時間のデータ処理中など、バックグラウンド スレッドからの UI 更新が必要になることがよくあります。 ただし、メイン以外のスレッドから UI 要素に直接アクセスすると、クロススレッド例外や予期しない動作が発生します。 解決策は Dispatcher.Invoke() を使用することです。

WPF Dispatcher は、UI 要素とのスレッドセーフな通信を可能にする重要なコンポーネントです。 Dispatcher.Invoke() は、メイン UI スレッドでコードを実行するメカニズムを提供します。

Dispatcher.Invoke()

を理解する

Dispatcher.Invoke() は、Action デリゲート (UI スレッドで実行されるコード) を受け入れます。 UI スレッドが使用可能になるまでブロックし、その後デリゲートを実行します。

例: プログレスバーの更新

バックグラウンド スレッドから進行状況バーを更新することを想像してください:

<code class="language-csharp">// Background worker for data retrieval
BackgroundWorker backgroundWorker = new BackgroundWorker();

// Progress reporting handler (runs on UI thread)
backgroundWorker.ProgressChanged += (sender, e) =>
{
    // Safe progress bar update using Dispatcher.Invoke()
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Background, () =>
    {
        this.progressBar.Value = e.ProgressPercentage;
    });
};

// Initiate background work
backgroundWorker.RunWorkerAsync();</code>

ここでは、ProgressChanged イベントが UI スレッドで発生します。 重要なステップは、Dispatcher.Invoke() を使用して progressBar を安全に更新することです。

重要な注意事項:

Dispatcher.Invoke() は、UI スレッドのブロックを回避する短い操作に最適です。長時間のタスクの場合は、適切な継続メカニズムを備えた BackgroundWorker または Task を使用します。

UI のフリーズを防ぐために、Dispatcher.Invoke() 内で長時間実行される操作を避けてください。 UI の応答性をよりスムーズにするために、タイマーや async/await などの非同期手法を検討してください。

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

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