C# BackgroundWorker和Dispatcher.BeginInvoke在WPF中

C# BackgroundWorker和Dispatcher.BeginInvoke在WPF中,c#,wpf,backgroundworker,C#,Wpf,Backgroundworker,在WPF中,当我们可以通过调用DoWork事件处理程序中的ReportProgress()方法,使用ProgressChangedEvent事件处理程序更新UI时,有人能告诉我为什么需要使用Dispatcher.BeginInvoke()方法从DoworkEvent处理程序更新UI吗? 如果我对后台工作人员和调度员的理解不正确,请纠正我 您需要记住一条规则: 更新UI需要从UI线程完成 记住这一点,让我们看看dispatcher做了什么,backgroundworker做了什么: 调度程序 di

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

您需要记住一条规则:

更新UI需要从UI线程完成

记住这一点,让我们看看dispatcher做了什么,backgroundworker做了什么:

调度程序 dispatcher是一个对象,当您调用BeginInvoke时,它将在创建dispatcher的线程上执行该方法。应用程序的调度程序总是在UI线程上创建的,因此这将起作用

背景工作者 后台工作程序非常类似,尽管它提供了基于事件的API:
当您在DoWork方法内调用
ReportProgress
时,BackgroundWorker将在创建后台工作线程的线程上引发一个事件。因此,如果在UI线程上创建后台工作线程,则可以在ProgressChanged事件处理程序中更新UI。

您需要记住一条规则:

更新UI需要从UI线程完成

记住这一点,让我们看看dispatcher做了什么,backgroundworker做了什么:

调度程序 dispatcher是一个对象,当您调用BeginInvoke时,它将在创建dispatcher的线程上执行该方法。应用程序的调度程序总是在UI线程上创建的,因此这将起作用

背景工作者 后台工作程序非常类似,尽管它提供了基于事件的API:
当您在DoWork方法内调用
ReportProgress
时,BackgroundWorker将在创建后台工作线程的线程上引发一个事件。因此,如果在UI线程上创建后台工作线程,则可以在ProgressChanged事件处理程序中更新UI。

您可以从BackgroundWorker的ProgressChanged处理程序安全地更新UI,而无需调用调度程序

每次调用时都会引发ProgressChanged事件。它在创建BackgroundWorker实例的线程上执行,该实例通常是UI线程

从正在报告的备注部分:

对ReportProgress方法的调用是异步的,返回 马上。ProgressChanged事件处理程序在线程上执行 这就产生了后台工作人员


您可以从BackgroundWorker的ProgressChanged处理程序安全地更新UI,而无需调用调度程序

每次调用时都会引发ProgressChanged事件。它在创建BackgroundWorker实例的线程上执行,该实例通常是UI线程

从正在报告的备注部分:

对ReportProgress方法的调用是异步的,返回 马上。ProgressChanged事件处理程序在线程上执行 这就产生了后台工作人员


如回答中所述,您不应仅从进度和完成的处理程序更新DoWork事件处理程序的UI。如回答中所述,您不应仅从进度和完成的处理程序更新DoWork事件处理程序的UI。