我正在阅读WPF书,我看到这段代码:
private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
int percenti;
percenti = e.ProgressPercentage;
progressBar1.Value = percenti;
}
问题很简单。如果
ProgressBar属于UI Thread,BackGroundWorker与后台线程一起使用
为什么没有错误(例如:调用线程无法访问此对象,因为另一个线程拥有它。)?
谢谢。
为什么没有错误(例如:调用线程无法访问此对象,因为另一个线程拥有它。)?
这是使用BackgroundWorker
的主要优势之一。 BackgroundWorker组件自动将进程和完成的调用封送回启动作业的同步上下文(线程)。
在这种情况下,这意味着ProgressChanged
(和完成事件)的事件处理程序发生在WPF UI线程上。
BackgroundWorker
为您处理线程上下文切换。事件BackgroundWorker.ProgressChanged
将在UI-Thread上引发,因此你的回调bgw1_ProgressChanged
将在UI-Thread的上下文中被调用。
这是BackgroundWorker
存在的主要目的:与UI结合使异步工作变得简单直接。
BackgroundWorker
自.NET 1.0以来就存在。现在我们生活在2012年,我们有Task类和Task Parallel Library,很快c#async
关键字作为一切手段的所有异步,这使得BackgroundWorker
有点过时或至少是旧学校。
这是因为您无法在后台工作程序的Do_work方法中进行更改。 progress_changed事件不断更新其他线程中发生的事情。
通过这个链接来清除你的概念 - > [https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners][1]