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