UI线程与BackGroundWorker线程

时间:2012-05-16 22:35:20

标签: wpf backgroundworker dispatcher

我正在读一本WPF书,我看到了这段代码:

    private void bgw1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        int percenti;
        percenti = e.ProgressPercentage;
        progressBar1.Value = percenti;
    }

问题很简单。 如果

ProgressBar属于UI Thread和 BackGroundWorker使用后台线程

为什么没有错误(例如:调用线程无法访问此对象,因为另一个线程拥有它。)

感谢。

3 个答案:

答案 0 :(得分:3)

  

为什么没有错误(例如:调用线程无法访问此对象,因为另一个线程拥有它。)

这是使用BackgroundWorker的主要优势之一。 BackgroundWorker组件自动将进度和完成的调用封送回启动作业的同步上下文(线程)。

在这种情况下,这意味着ProgressChanged的事件处理程序(以及完成事件)发生在WPF UI线程上。

答案 1 :(得分:2)

BackgroundWorker为您处理线程上下文切换。事件BackgroundWorker.ProgressChanged将在UI-Thread上引发,因此您的回调bgw1_ProgressChanged将在UI-Thread的上下文中被调用。

这是BackgroundWorker存在的主要目的:与UI结合使异步工作变得简单直接。

从.NET 1.0开始,

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]