【问题标题】:UI thread vs. BackGroundWorker threadUI 线程与 BackGroundWorker 线程
【发布时间】:2012-05-16 22:35:19
【问题描述】:

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

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

问题很简单。 如果

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

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

谢谢。

【问题讨论】:

    标签: wpf backgroundworker dispatcher


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-08
          • 2016-07-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多