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

【C#学习】backgroundWorker控件

BackgroundWorker 控件的几个实例(C# backgroundworker使用方法):

在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。
解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。
新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundWorker 类实现。

用 BackgroundWorker 类执行耗时的操作
BackgroundWorker 类在 System.ComponentModel 命名空间下。
VS 的工具箱时有一个 BackgroundWorker 组件,就是这个类。

常用方法
1.RunWorkerAsync
开始执行后台操作。引发 DoWork 事件

2.CancelAsync
请求取消挂起的后台操作。
注意:这个方法是将 CancellationPending 属性设置为 true,并不会终止后台操作。在后台操作中要检查 CancellationPending 属性,来决定是否要继续执行耗时的操作。

3.ReportProgress
引发 ProgressChanged 事件。

常用属性
1.CancellationPending
指示应用程序是否已请求取消后台操作。
只读属性,默认为 false,当执行了 CancelAsync 方法后,值为 true。

2.WorkerSupportsCancellation
指示是否支持异步取消。要执行 CancelAsync 方法,需要先设置该属性为 true。

3.WorkerReportsProgress
指示是否能报告进度。要执行 ReportProgress 方法,需要先设置该属性为 true。

常用事件
1.DoWork
调用 RunWorkerAsync 方法时发生。

2.RunWorkerCompleted
后台操作已完成、被取消或引发异常时发生。

3.ProgressChanged
调用 ReportProgress 方法时发生。

在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

如果想在 DoWork 事件处理程序中和用户界面的控件通信,可在用 ReportProgress 方法。
ReportProgress(int percentProgress, object userState),可以传递一个对象。

ProgressChanged 事件可以从参数 ProgressChangedEventArgs 类的 UserState 属性得到这个信息对象。

简单的程序用 BackgroundWorker 比 Thread 方便,Thread 中和用户界面上的控件通信比较麻烦,需要用委托来调用控件的 Invoke 或 BeginInvoke 方法,没有 BackgroundWorker 方便。

============================

一个简单的刷网页流量的小工具代码

  1. 从工具栏拖一个BackgroundWorker控件,设置其属性WorkerReportsProgress为true

  2. 要让worker开始工作,执行如下代码:
    mBackgroundWorker.RunWorkerAsync(arg);
    这里有重写,如果不需要传递参数直接mBackgroundWorker.RunWorkerAsync();

  3. 编辑DoWork事件代码:
    e.Argument为mBackgroundWorker.RunWorkerAsync(arg);对应的参数
    之所以使用进度条,肯定是有循环的,在循环中报告进度:
    worker.ReportProgress(i * 100 / totalNum, obj );
    其中第一个参数是当前进度的百分之多少,obj为你要传递的UserState,如果没有可以不要

  4. 编辑ProgressChanged事件代码:
    e.ProgressPercentage为进度的百分数,e.UserState为刚才传递过来的object
    在这个事件中可以调用ui的进度条和其他控件:
    mToolStripProgressBar.Value = e.ProgressPercentage;

相关文章:

  • Qt之qobject_cast使用
  • 媒体软文投放的流程与媒体平台的选择
  • Android---动态权限适配问题
  • Unity 下载Zip压缩文件并且解压缩
  • Android Rxjava架构原理与使用的详解解答
  • 【第2章 Node.js基础】2.3 Node.js事件机制
  • 【数学】Pair of Topics—CF1324D
  • Android各类View触摸监听器失效
  • 【GitHub】PR的学习笔记
  • bin、hex、ELF文件格式上的区别
  • Spring 常见面试题
  • 基于JavaWeb+SpringBoot+Vue摩托车商城微信小程序系统的设计和实现
  • STM32——NVIC中断优先级管理分析
  • springcloud旅游网站源码
  • 使用LLM-Tuning实现百川和清华ChatGLM的Lora微调
  • [ JavaScript ] 数据结构与算法 —— 链表
  • __proto__ 和 prototype的关系
  • canvas 高仿 Apple Watch 表盘
  • Go 语言编译器的 //go: 详解
  • idea + plantuml 画流程图
  • Invalidate和postInvalidate的区别
  • Java知识点总结(JavaIO-打印流)
  • JSDuck 与 AngularJS 融合技巧
  • Linux CTF 逆向入门
  • PHP面试之三:MySQL数据库
  • React-生命周期杂记
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 得到一个数组中任意X个元素的所有组合 即C(n,m)
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 老板让我十分钟上手nx-admin
  • 数据结构java版之冒泡排序及优化
  • - 转 Ext2.0 form使用实例
  • 阿里云ACE认证学习知识点梳理
  • 大数据全解:定义、价值及挑战
  • 交换综合实验一
  • 如何在招聘中考核.NET架构师
  • ​一、什么是射频识别?二、射频识别系统组成及工作原理三、射频识别系统分类四、RFID与物联网​
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • "无招胜有招"nbsp;史上最全的互…
  • $().each和$.each的区别
  • $NOIp2018$劝退记
  • ( 10 )MySQL中的外键
  • (003)SlickEdit Unity的补全
  • (20)目标检测算法之YOLOv5计算预选框、详解anchor计算
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (十六)串口UART
  • (五)Python 垃圾回收机制
  • (小白学Java)Java简介和基本配置
  • (一)appium-desktop定位元素原理
  • (转载)(官方)UE4--图像编程----着色器开发
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • .Net Web项目创建比较不错的参考文章