1

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

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

问题很简单。如果

ProgressBar 属于 UI 线程,BackGroundWorker 与后台线程一起工作

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

谢谢。

4

3 回答 3

3

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

这是使用BackgroundWorker. BackgroundWorker 组件自动将进度和完成调用编组回启动作业的同步上下文(线程)。

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

于 2012-05-16T22:40:39.457 回答
2

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

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

BackgroundWorker自 .NET 1.0 以来就存在。现在我们生活在 2012 年,我们拥有Task类和Task Parallel Library,并且很快将 c#async关键字作为所有异步的通用手段,这使得这种BackgroundWorker类型过时或至少是老派。

于 2012-05-16T22:37:33.073 回答
0

这是因为您无法更改后台工作人员的 Do_work 方法。progress_changed 事件不断更新另一个线程中发生的事情。

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

于 2018-09-02T02:36:39.853 回答