0

操作中に操作の進行状況を 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 スレッドにディスパッチしたくありません。その後、処理にかかる時間が隠され (コレクションの変更によってトリガーされるイベントには時間がかかる場合があります)、ダイアログが無意味になります。

4

0 に答える 0