WPF中的BackgroundWorker和Dispatcher.BeginInvoke

时间:2013-04-21 14:19:28

标签: c# wpf backgroundworker

当我们可以通过在DoWork事件Eventhandler中调用ReportProgress()方法使用ProgressChangedEvent事件处理程序更新UI时,有人可以告诉我为什么我们需要使用Dispatcher.BeginInvoke()方法从DoworkEvent处理程序更新UI? 如果我对背景工作者和调度员的理解不正确,请纠正我?

2 个答案:

答案 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。