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 线程调度一个调用以关闭对话框

这有效,......直到我想修改一个不支持在非 UI 线程上修改的集合,例如 ObservableCollection。我不想将这些修改分派到 UI 线程,因为它只会返回,隐藏事情需要多长时间(由集合更改触发的事件可能需要一段时间),使对话框毫无意义。

4

0 回答 0