我如何向 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 线程,因为它只会返回,隐藏事情需要多长时间(由集合更改触发的事件可能需要一段时间),使对话框毫无意义。