Wpf 报告作业进度
在进行某项操作时,如何向UI报告该操作的进度?i、 我想做一些类似的事情: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";
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事件逻辑