WPF アプリケーションで、UI 要素 (例: 、プログレス バー、テキスト ブロックなど)、別のクラスに属するバックグラウンド スレッドで実行されている長時間の計算中に発生します。ただし、従来の方法では効果がないとわかっているため、この課題にどのようにアプローチすればよいかわかりません。
最も効果的な解決策は、イベントとディスパッチャーを利用することです。その方法は次のとおりです:
計算クラスのイベント宣言:
計算を担当するクラス内 (例: 、calcClass)、UI に進行状況を通知するイベントを宣言します。更新:
public event EventHandler<EventArgs<YourStatus>> ProgressUpdate;
メインクラスでのイベント登録:
メインUI クラス (MainWindow など)、ProgressUpdate に登録イベント:
calcClass.ProgressUpdate += (s, e) => { Dispatcher.Invoke((Action)delegate() { /* Update UI */ }); };
計算におけるイベントトリガークラス:
計算メソッド内で、必要に応じて ProgressUpdate イベントをトリガーします:
//part 1 if(ProgressUpdate != null) ProgressUpdate(this, new YourStatus(status)); //part 2
を使用する 一般的にはイベントとディスパッチャーが好まれますが、代わりに、BackgroundWorker コンポーネントを使用することもできます:
メイン クラスでのワーカーの作成とイベント処理:
var worker = new BackgroundWorker(); worker.DoWork += (s, e) => { /* Perform calculations */ }; worker.ProgressChanged += (s, e) => { /* Update UI with progress */ }; worker.RunWorkerCompleted += (s, e) => { /* Finalize UI updates */ };
計算のバックグラウンドで計算を開始するクラス:
worker.RunWorkerAsync(input);
イベントとディスパッチャを使用すると、BackgroundWorker に比べてより多くの制御と柔軟性が得られることに注意してください。
適用することによりこれらのテクニックを使用すると、バックグラウンド スレッドから UI 要素を効率的に更新し、応答性とシームレスなユーザー インタラクションを確保できます。
以上が別のクラスのバックグラウンド スレッドから WPF UI を安全に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。