当前位置: 首页 > article >正文

【WPF】BackgroundWorker类

【WPF】BackgroundWorker类

  • BackgroundWorker 类的主要特点
  • 如何使用 BackgroundWorker
  • 示例代码

  在WPF(Windows Presentation Foundation)应用程序中,BackgroundWorker 是一个非常有用的类,它帮助开发者在后台线程上执行操作,同时保持用户界面的响应性。这是因为WPF应用程序默认运行在一个主线程上,即UI线程。如果长时间的操作直接在这个UI线程上执行,那么整个应用程序的界面会变得无响应,用户体验会大大降低。

BackgroundWorker 类的主要特点

  1. 异步操作:BackgroundWorker 可以在单独的后台线程中执行耗时的操作,这样就不会阻塞UI线程。
  2. 进度报告:可以向UI线程报告工作进度,允许你在操作进行时更新UI。
  3. 取消支持:提供了取消正在进行的操作的能力。
  4. 完成通知:当后台操作完成后,可以通过事件通知UI线程。

如何使用 BackgroundWorker

  要使用 BackgroundWorker,首先需要创建一个 BackgroundWorker 实例,并设置其属性,如是否支持进度报告和取消操作。然后,你需要订阅 DoWork、ProgressChanged 和 RunWorkerCompleted 事件。

  • DoWork:这是你放置长时间运行操作的地方。这个方法是在后台线程中运行的,因此不应该在此方法中访问任何UI元素。
  • ProgressChanged:当你调用 ReportProgress 方法时,此事件会被触发。你可以用它来更新UI,比如显示一个进度条。
  • RunWorkerCompleted:当后台操作完成时,此事件会被触发。你可以在该事件处理程序中检查操作是否成功完成,或者是否被取消。

示例代码

  下面是一个简单的 BackgroundWorker 使用示例,演示了如何在WPF应用中使用它来执行一个耗时的任务,并报告进度:

using System;
using System.ComponentModel;
using System.Threading;
using System.Windows;

namespace WpfApp
{
    public partial class MainWindow : Window
    {
        private BackgroundWorker backgroundWorker;

        public MainWindow()
        {
            InitializeComponent();
            InitializeBackgroundWorker();
        }

        private void InitializeBackgroundWorker()
        {
            backgroundWorker = new BackgroundWorker
            {
                WorkerReportsProgress = true,
                WorkerSupportsCancellation = true
            };

            backgroundWorker.DoWork += BackgroundWorker_DoWork;
            backgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
            backgroundWorker.RunWorkerCompleted += BackgroundWorker_RunWorkerCompleted;
        }

        private void StartButton_Click(object sender, RoutedEventArgs e)
        {
            if (!backgroundWorker.IsBusy)
            {
                backgroundWorker.RunWorkerAsync();
            }
        }

        private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            for (int i = 1; i <= 100; i++)
            {
                if (backgroundWorker.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }

                // 模拟耗时操作
                Thread.Sleep(100);

                // 报告进度
                backgroundWorker.ReportProgress(i);
            }
        }

        private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            // 更新进度条
            ProgressBar.Value = e.ProgressPercentage;
        }

        private void BackgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("任务已取消");
            }
            else if (e.Error != null)
            {
                MessageBox.Show($"发生错误: {e.Error.Message}");
            }
            else
            {
                MessageBox.Show("任务已完成");
            }
        }
    }
}

  在这个例子中,我们创建了一个 BackgroundWorker 实例,并设置了它的 WorkerReportsProgress 和 WorkerSupportsCancellation 属性。我们还定义了三个事件处理程序来处理后台工作的开始、进度更新和完成。当点击“开始”按钮时,后台工作将开始执行,并定期更新进度条。如果用户请求取消操作,BackgroundWorker 也会相应地处理取消请求。

  需要注意的是,虽然 BackgroundWorker 是一个简单而强大的工具,但在.NET Core和.NET 5+中,更推荐使用 Task 和 async/await 来实现异步编程,因为它们提供了更现代和灵活的方式来处理多线程和异步操作。


http://www.kler.cn/a/375185.html

相关文章:

  • 如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令以及Vscode中的环境路径配置中找不到gcc
  • ctfshow(89,90)--PHP特性--intval函数
  • 【数据结构】数组和向量
  • 使用Python进行数据分析入门
  • vue 和 django 报 CORS(跨域资源共享,Cross-Origin Resource Sharing)是一种跨域访问的机制,
  • Unsafe Fileupload-pikachu
  • 龙迅#LT8668EX显示器图像处理芯片 适用于HDMI1.4+VGA转4PORT LVDS,支持4K30HZ分辨率,可做OSD菜单亮度调节!
  • 什么是继电器干接点输出
  • 功能测试:方法、流程与工具介绍
  • 20万高薪专业-网络安全(非常详细)零基础入门到精通,收藏这一篇就够了
  • 【源码+文档】基于SpringBoot+Vue旅游网站系统【提供源码+答辩PPT+参考文档+项目部署】
  • 基于企业微信与开源 AI 智能名片 2 + 1 链动模式 S2B2C 商城小程序的客户运营模型优化研究
  • docker file容器化部署Jenkins(一)
  • 【笔面试常见题:三门问题】用条件概率、全概率和贝叶斯推导
  • 语音IC方案,在交通信号灯语音提示器的应用解析,NV040D
  • Windows 基础 (二):系统目录与环境变量
  • 搭建SRS流媒体服务器处理多路无人机视频流
  • 跨境行业的客户运营利器:构建在线培训知识库
  • mac下使用docker安装php7.4环境
  • 网络编程基础-Reactor线程模型-原理剖析
  • Nginx负载均衡配置详解
  • ConcurrentHashMap底层实现是什么
  • Linux高阶——1027—
  • AI产品经理实战手册:策略、开发与商业化指南
  • 2021李宏毅机器学习 1 机器学习基础 笔记
  • 树莓派开发相关知识六 -串口通讯