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