首页 > 编程语言 >C# - 异步编程 - BackgroundWorker 类

C# - 异步编程 - BackgroundWorker 类

时间:2024-10-04 10:35:31浏览次数:8  
标签:异步 RunWorkerCompleted C# DoWork bgWorker BackgroundWorker Handler 线程

后台线程,BackgroundWorker 类用于创建一个线程,在后台持续运行以完成某项工作,并不时地与主线程通信。

BackgroundWorker 类的属性,方法与事件。

属性:

  • WorkerReportsProgress :设置后台任务是否可以把它的进度汇报给主线程。
  • WorkerSupportsCancellation :是否支持从主线程取消。
  • IsBusy :检查后台任务是否正在运行。
  • CancellationPending :每隔一段时间会检查该属性是否停止处理。

事件:

  • DoWork - 在后台线程开始时触发。
  • ProgressChanged - 后台任务汇报进度时触发。
  • RunWorkerCompleted - 后台工作线程退出时触发。

方法:

  • RunWorkerAsync() - 获取后台线程并执行 DoWork 事件处理程序。
  • CancelAsync() - 设置 CancellationPending 属性为true。
  • DoWork() - 事件处理程序希望向主线程序汇报进度的时候,调用 ReportProgress 方法。
 1 namespace WpfApp1
 2 {
 3     /// <summary>
 4     /// MainWindow.xaml 的交互逻辑
 5     /// </summary>
 6     public partial class MainWindow : Window
 7     {
 8         BackgroundWorker bgWorker = new BackgroundWorker();
 9         public MainWindow()
10         {
11             InitializeComponent();
12             // 初始化
13             bgWorker.WorkerReportsProgress = true;
14             bgWorker.WorkerSupportsCancellation = true;
15             
16             // 事件注册
17             bgWorker.DoWork += DoWork_Handler;
18             bgWorker.ProgressChanged += ProgressChanged_Handler;
19             bgWorker.RunWorkerCompleted += RunWorkerCompleted_Handler;
20         }
21 
22         private void RunWorkerCompleted_Handler(object sender, RunWorkerCompletedEventArgs e)
23         {
24             progressBar.Value = 0;
25             if (e.Cancelled)
26                 MessageBox.Show("Process was cancelled.", "Process Cancelled");
27             else
28                 MessageBox.Show("Process completed normally.", "Process Completed");
29         }
30 
31         private void ProgressChanged_Handler(object sender, ProgressChangedEventArgs e)
32         {
33             // 设置进度条值
34             progressBar.Value = e.ProgressPercentage;
35         }
36 
37         private void DoWork_Handler(object sender, DoWorkEventArgs e)
38         {
39             BackgroundWorker worker = sender as BackgroundWorker;
40 
41             for (int i = 0; i <= 10; i++)
42             {
43                 // 循环判断 CancellationPending 是否为true。
44                 if (worker.CancellationPending)
45                 {
46                     e.Cancel = true;
47                     break;
48                 }
49                 else
50                 {
51                     // 触发主线程 ProgressChanged
52                     worker.ReportProgress(i * 10);
53                     Thread.Sleep(250);
54                 }
55 
56             }
57         }
58 
59         private async void btnProcess_Click(object sender, RoutedEventArgs e)
60         {
61             // 判断当前后台线程是否运行
62            if (!bgWorker.IsBusy)
63                 // 调用方法启动后台线程,并触发 DoWork 事件
64                 bgWorker.RunWorkerAsync();
65         }
66 
67         private void btnCancel_Click(object sender, RoutedEventArgs e)
68         {
69             // 设置对象 CancelltionPending 为true;
70             bgWorker.CancelAsync();
71         }
72     }
73 }

 

标签:异步,RunWorkerCompleted,C#,DoWork,bgWorker,BackgroundWorker,Handler,线程
From: https://www.cnblogs.com/icecokelulu/p/18446407

相关文章

  • Linux ifconfig 命令详解
    ifconfig配置和显示Linux系统网卡的网络参数补充说明ifconfig命令 被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。语法ifconfig(参......
  • 查看虚拟机centos 7 的 IP 地址和命令
    用于生产环境下 安装CENTOS7太费时间,研究阶段放在虚拟机里面 是最好的选择:但是安装完毕后就出现问题  无法使用IFCONFIG;毕竟内核不一样 首先我们登录操作系统用户名root密码123456然后我们输入ip查询命名ipaddr 也可以输入ifconfig查看ip,但此命令会出......
  • 【题解】「CF765F」Souvenirs
    https://www.luogu.com.cn/problem/CF765F首先有一个比较navie的\(O(n\sqrtm\logn)\)的做法(add和del的时候,用两个multiset维护一下。有一个bitset的做法来优化用multiset查询前驱后继的做法:https://www.luogu.com.cn/article/zcmco6hd首先考虑离线下来,将询问挂......
  • cnblogs内容同步到51cto上的说明(声明)
    51CTO网站上的blog地址为:https://blog.51cto.com/u_15642578该地址是个人在博客园cnblogs上的同步账号(https://cnblogs.com/xyz),在cnblogs上发表的内容会不定期的在经过51CTO审核通过后同步到该51CTO地址下。之所以将cnblogs上的文章同步到51CTO网站上,其原因有两个:希望自己的......
  • Codeforces Round 972 (Div. 2)
    一万一参赛,VP赛时136A.SimplePalindrome简单构造题。字母集是5,相同字母间一定构成若干回文子串。将相同字母排列在一起,则只有相同字母可以构成回文子串。显然,优先添加较少的字母即可。#include<bits/stdc++.h>usingnamespacestd;intT,n;chars[5]={'a','e','i......
  • CSP-J/S2024总结
    CSP-J/S2024游记初赛前记今年最后一年J了...希望圆我个2年都没有实现的J一等梦还有希望S考好点期待1=day-1考完不放假,然后月考,高兴坏了day1没什么好说的,行就行,不行就AFO(假CSP-J本来就打算摆烂,所以不慌因为是最后一个考场,只有26人,赢!嗯?开局放int?完辣!组合题放那......
  • QT5 C++槽函数的两种connect连接方式的区别,建议使用现代的连接方式
    QT5C++槽函数的两种connect连接方式的区别,建议使用现代的连接方式(1)QT5C++槽函数定义classMainWindow:publicQMainWindow{Q_OBJECT//......privateslots:voidslotSplitterMoved(int,int);//......}(2)使用旧的字符串connect连接方式,容易报错或者警告 连......
  • 南沙C++信奥赛陈老师解一本通题 1270:【例9.14】混合背包
    ​ 【题目描述】一个旅行者有一个最多能装V公斤的背包,现在有n件物品,它们的重量分别是W1,W2,...,Wn,它们的价值分别为C1,C2,...,Cn。有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包)。求解将哪些物品装入背包可使这些物品的费用总......
  • CF154C题解
    传送门:https://codeforces.com/problemset/problem/154/C求出无向图中,满足所有出边都相连或出边直接连接点对的点对数。很显然可以暴力枚举点对一对对去check,时间复杂度\(O(n^2+m)\)。#include<bits/stdc++.h>usingnamespacestd;inlineintread(){charc;boo......
  • Debuggers 1012:Introductory GDB
    OpenSecurityTraining2LearningPaths:VulnerabilityHunting&Exploitationpython:https://www.learnpython.org/路径图:https://ost2.fyi/OST2_LP_Vulns_Exploits.pdfDebuggers1012:IntroductoryGDB(与python)-->Architecture1001:x86-64Assembly-->R......