UI线程与BackGroundWorker线程

问题描述 投票:1回答:3

我正在阅读WPF书,我看到这段代码:

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

问题很简单。如果

ProgressBar属于UI Thread,BackGroundWorker与后台线程一起使用

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

谢谢。

wpf backgroundworker dispatcher
3个回答
3
投票

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

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

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


2
投票

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

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

BackgroundWorker自.NET 1.0以来就存在。现在我们生活在2012年,我们有Task类和Task Parallel Library,很快c#async关键字作为一切手段的所有异步,这使得BackgroundWorker有点过时或至少是旧学校。


0
投票

这是因为您无法在后台工作程序的Do_work方法中进行更改。 progress_changed事件不断更新其他线程中发生的事情。

通过这个链接来清除你的概念 - > [https://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners][1]

© www.soinside.com 2019 - 2024. All rights reserved.