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

2.2 BackgroundWorker的使用介绍

        BackgroundWorker 是 .NET Framework 中一个简化异步操作的组件,它位于 System.ComponentModel 命名空间下。它为开发人员提供了一种简单的方式在后台执行耗时操作,同时保持与 UI 线程的交互

主要属性以及任务如下:

  • DoWork 事件:在后台线程中执行耗时操作:(不能直接调用UI控件)

  • RunWorkerAsync 方法:启动后台操作

  • ReportProgress 方法:报告操作进度

  • ProgressChanged 事件:当进度更新时触发:(可以直接调用UI控件)

  • RunWorkerCompleted 事件:当操作完成时触发(可以直接调用UI控件)

  • CancellationPending 属性:检查是否请求取消

  • CancelAsync 方法:请求取消操作

  • IsBusy 属性:指示是否正在运行后台操作

  • 注意事项:

  1. 在 DoWork 事件处理程序中不要直接访问UI控件

  2. 如果需要传递数据,可以使用 RunWorkerAsync(object) 和 DoWorkEventArgs.Argument

  3. 结果可以通过 RunWorkerCompletedEventArgs.Result 传递回UI线程

例如:下面是一个wpf的小例子,仿真了开始,取消,以及汇报进度的功能。

 public partial class BackgroundDemo : Window{BackgroundWorker bw;public BackgroundDemo(){InitializeComponent();bw = new BackgroundWorker();bw.WorkerReportsProgress = true;bw.WorkerSupportsCancellation = true;bw.DoWork += Bw_DoWork;bw.ProgressChanged += Bw_ProgressChanged;bw.RunWorkerCompleted += Bw_RunWorkerCompleted;btnCancel.IsEnabled = false;}private void Bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){pbPercent.Value = 100;this.btnCancel.IsEnabled = false;this.btnStart.IsEnabled = true;if(e.Error!=null){this.tbInfo.Text = "异常" + e.Error.Message;}else if(e.Cancelled){this.tbInfo.Text = "被取消";}else{this.tbInfo.Text = "正常完成";}}private void Bw_ProgressChanged(object sender, ProgressChangedEventArgs e){this.pbPercent.Value = e.ProgressPercentage;}private void Bw_DoWork(object sender, DoWorkEventArgs e){int timer =(int) e.Argument;if (timer <= 0) timer = 20;for(int i=0;i<timer;i++){if(bw.CancellationPending){e.Cancel = true;break;}Thread.Sleep(1000);bw.ReportProgress(  i*100 / timer);}}private void btnStart_Click(object sender, RoutedEventArgs e){this.btnStart.IsEnabled = false;this.btnCancel.IsEnabled = true;bw.RunWorkerAsync(10);  //运行20秒this.tbInfo.Text = "开始计时中";}private void btnCancel_Click(object sender, RoutedEventArgs e){bw.CancelAsync();}}
<Window x:Class="AHui_ProjectManager.Model.BackgroundDemo"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:AHui_ProjectManager.Model"mc:Ignorable="d"Title="BackgroundDemo" Height="450" Width="800"><Grid><TextBlock x:Name="tbInfo" HorizontalAlignment="Left" Height="23"  Background="LightBlue"Margin="0,50,0,0" VerticalAlignment="top" Width="381"/><ProgressBar x:Name="pbPercent" HorizontalAlignment="Left" Height="23" Margin="0,90,0,0" VerticalAlignment="top" Width="381"/><Button x:Name="btnStart" Content="开始" HorizontalAlignment="Left" Height="23" Margin="0,135,0,0" VerticalAlignment="top" Width="60" Click="btnStart_Click"/><Button x:Name="btnCancel" Content="取消"  HorizontalAlignment="Left" Height="23" Margin="306,135,0,0" VerticalAlignment="top" Width="60" Click="btnCancel_Click"/></Grid>
</Window>

http://www.xdnf.cn/news/43417.html

相关文章:

  • Python实现对大批量Word文档进行批量自动化排版(15)
  • 数字系统与编码
  • 2020 年 7 月大学英语四级考试真题(组合卷)——解析版
  • 并发设计模式实战系列(4):线程池
  • RabbitMQ和Seata冲突吗?Seata与Spring中的事务管理冲突吗
  • Chromium 134 编译指南 Ubuntu篇:环境搭建与源码获取(一)
  • PyTorch基础笔记
  • python爬虫复习
  • 杨氏矩阵、字符串旋转、交换奇偶位,offsetof宏
  • Java发生OOM是否必然导致JVM退出
  • 30天开发操作系统 第26天 -- 为窗口移动提速
  • 如何将自己封装的组件发布到npm上:详细教程
  • 组装一台intel n95纯Linux Server服务器
  • UniFlash以串口方式烧录MSPM0G3507(无需仿真器)
  • 方案精读:数字政府智慧政务服务一网通办服务解决方案【附全文阅读】
  • 精通 Spring Cache + Redis:避坑指南与最佳实践
  • 鸿蒙ArkUI之布局实战,线性布局(Column,Row)、弹性布局(Flex)、层叠布局(Stack),详细用法
  • 【后端】【Django】Django 模型中的 `clean()` 方法详解:数据校验的最后防线
  • 【2025面试常问Java八股】AQS介绍(AbstractQueuedSynchronizer 抽象队列同步器)
  • 深入剖析 Java Web 项目序列化:方案选型与最佳实践
  • 嵌入式人工智能应用-第三章 opencv操作 5 二值化、图像缩放
  • Linux进程状态
  • 05【数据基石·下】复合类型:元组 (Tuple) 与数组 (Array) 的定长世界
  • 【MySQL】Read view存储的机制,记录可见分析
  • *数字信号基础
  • Nginx在微服务架构项目(Spring Cloud)中的强大作用
  • 【智驾中的大模型 -3】VLA 在自动驾驶中的应用
  • 运维侠职场日记9:用DeepSeek三天通关详解自动化操作pdf批量提取PDF文字将PDF转Word文档(附上脚本代码)
  • SpringBoot实战3
  • jupyter切换存储路径