Wpf 报告作业进度

Wpf 报告作业进度,wpf,report,backgroundworker,progress,ui-thread,Wpf,Report,Backgroundworker,Progress,Ui Thread,在进行某项操作时,如何向UI报告该操作的进度?i、 我想做一些类似的事情: void DoExpensiveOperation() { var dlg = new ShowProgressDialog(); dlg.ShowDialog(); dlg.Status = "StepOne"; dlg.Progress = "10%"; DoStepOne(); DoStepTwo(); dlg.Status = "StepTwo";

在进行某项操作时,如何向UI报告该操作的进度?i、 我想做一些类似的事情:

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();
}
很明显,这是行不通的,原因有很多。我开始尝试使用后台工作程序来解决这个问题。我在后台线程上完成所有工作,然后简单地将“开始”、“进度更改”和“结束”事件分别发送到UI、ShowDialog、ReportProgress和CloseDialog

  • 当引发DoWork事件时,它向UI线程发送一个调用以显示对话框
  • 然后,它继续在后台线程中执行工作
  • 通过将进度通知发送到UI线程来报告进度
  • 当引发RunWorkerCompleted时,将向UI线程发送一个调用以关闭对话框

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

只需使用
可观察集合的副本
转换为
列表
(使用
LinQ
)对于您的后台操作:
List List=yourObservableCollection.ToList()
不确定这会有什么帮助,因为这样会破坏我的CollectionChanged事件逻辑