操作中に操作の進行状況を UI に報告するにはどうすればよいですか? つまり、次のようなことをしたい:
void DoExpensiveOperation()
{
var dlg = new ShowProgressDialog();
dlg.ShowDialog();
dlg.Status = "StepOne";
dlg.Progress = "10%";
DoStepOne();
DoStepTwo();
dlg.Status = "StepTwo";
dlg.Progress = "70%";
DoLastStep();
dlg.Status = "LastStep";
dlg.Progress = "100%";
dlg.Close();
}
明らかに、これはいくつかの理由で機能しません。バックグラウンドワーカーを使用してこれを解決しようと試みました。すべての作業をバックグラウンド スレッドで実行し、「begin」、「progressChange」、「end」イベントをそれぞれ UI の「ShowDialog」、「report progress」、「close Dialog」にディスパッチするだけです。
- DoWork イベントが発生すると、UI スレッドに呼び出しをディスパッチしてダイアログを表示します。
- その後、バックグラウンド スレッドで作業を実行し続けます。
- 進行状況は、進行状況通知を UI スレッドにディスパッチすることによって報告されます。
- RunWorkerCompleted が発生すると、ダイアログを閉じる呼び出しが UI スレッドにディスパッチされます。
これは機能します... ObservableCollection などの非 UI スレッドでの変更をサポートしていないコレクションを変更するまでは。これらの変更を UI スレッドにディスパッチしたくありません。その後、処理にかかる時間が隠され (コレクションの変更によってトリガーされるイベントには時間がかかる場合があります)、ダイアログが無意味になります。