当前位置: 首页 > 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>

相关文章:

  • CentOS 10 /root 目录重新挂载到新分区槽
  • Qt中修改了UI设计文件后编译不生效问题的解决办法
  • 拼多多面经,暑期实习Java一面
  • 20. git diff
  • 博客系统-RabbitMQ
  • 【自然语言处理与大模型】Linux环境下Ollama下载太慢了该怎么处理?
  • 计算机网络中的网络层:架构、功能与重要性
  • IPv4地址分类与常用网络地址详解
  • 易语言验证京东滑块轨迹算法
  • Beszel​​ 轻量级服务器监控平台的详细安装步骤
  • 软考复习——综合布线
  • 用键盘实现控制小球上下移动——java的事件控制
  • C语言自增自减题目
  • 【英语语法】词法---副词
  • 【Oracle专栏】函数中SQL拼接参数 报错处理
  • unordered_map、unordered_set详解
  • 学习笔记二十——Rust trait
  • RabbitMQ,添加用户时,出现Erlang cookie不一致,导致添加用户失败的问题解决
  • 防抖与节流的理解与应用
  • 代码随想录算法训练营第三十五天|416. 分割等和子集、698.划分为k个相等的子集、473.火柴拼正方形
  • 第1现场|俄乌互指对方违反复活节临时停火提议
  • 延安市委副书记马月逢已任榆林市委副书记、市政府党组书记
  • 新城市志|全球供应链动荡加剧,中国稳外贸有信心有底气
  • 对话地铁读书人|来自大学教授的科普:读书日也是版权日
  • 海南热带雨林国家公园核心保护区一水电站设施将拆除,曾被中央环保督察通报
  • 十四届全国人大常委会第十五次会议将于4月27日至30日举行