当我们可以通过在DoWork事件Eventhandler中调用ReportProgress()方法使用ProgressChangedEvent事件处理程序更新UI时,有人可以告诉我为什么我们需要使用Dispatcher.BeginInvoke()方法从DoworkEvent处理程序更新UI? 如果我对背景工作者和调度员的理解不正确,请纠正我?
答案 0 :(得分:2)
您需要记住一条规则:
需要从UI线程更新UI。
记住这一点,让我们看看调度员做了什么以及后台工作者做了什么:
<强>分派器强> 调度程序是一个对象,当您调用BeginInvoke时,将在创建调度程序的线程上执行该方法。应用程序的调度程序始终在UI线程上创建,因此这将起作用。
后台工作人员
后台工作者非常相似,虽然它提供了基于事件的API:
当您在DoWork方法中调用ReportProgress
时,BackgroundWorker将在创建后台工作程序的线程上引发事件。因此,如果在UI线程上创建Background-Worker,则可以更新ProgressChanged事件处理程序中的UI。
答案 1 :(得分:2)
您可以安全地从BackgroundWorker的ProgressChanged处理程序更新UI,而无需调用Dispatcher。
只要您拨打ReportProgress,就会提出ProgressChanged事件。它在创建BackgroundWorker实例的线程上执行,该实例通常是UI线程。
来自ReportProgress的备注部分:
对ReportProgress方法的调用是异步的并返回 立即。 ProgressChanged事件处理程序在线程上执行 创建了BackgroundWorker。