介绍:

根据MSDN介绍:
         BackgroundWorker 类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。 如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
       若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。 可以通过编程方式创建 BackgroundWorker,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。 如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
       若要为后台操作做好准备,请添加 DoWork 事件的事件处理程序。 在此事件处理程序中调用耗时的操作。 若要开始此操作,请调用 RunWorkerAsync。 若要收到进度更新的通知,请处理 ProgressChanged 事件。 若要在操作完成时收到通知,请处理 RunWorkerCompleted 事件。

有2点需要注意的: 
   1、由于DoWork事件内部的代码运行在非UI线程之上,确保在 DoWork 事件处理程序中不操作任何用户界面对象。 而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。

2、BackgroundWorker 事件不跨 AppDomain 边界进行封送处理。 请不要使用 BackgroundWorker 组件在多个 AppDomain 中执行多线程操作。

使用:

运行显示:

1、声明一个BackgroundWorker

BackgroundWorker backgroundWorker1 = null;

2、初始化BackgroundWorker,设置属性并绑定事件

public Form1()
{InitializeComponent();backgroundWorker1 = new BackgroundWorker();backgroundWorker1.WorkerReportsProgress = true;//能否报告进度更新。backgroundWorker1.WorkerSupportsCancellation = true;//是否支持异步取消//绑定事件backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
}

3、BackgroundWorker事件

DoWork事件

private void backgroundWorker1_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
{    //句柄sender指向的就是该BackgroundWorker。//e.Argument 获取异步操作参数的值  //e.Cancel 是否应该取消事件//e.Result  获取或设置异步操作结果的值(在RunWorkerCompleted事件可能会使用到)object a = e.Argument;//获取RunWorkerAsync(object argument)传入的值BackgroundWorker worker = sender as BackgroundWorker;for (int i = 1; i <= 10; i++){if (worker.CancellationPending == true)//在耗时操作中判断CancellationPending属性,如果为false则退出{e.Cancel = true;break;}else{// Perform a time consuming operation and report progress.System.Threading.Thread.Sleep(500);worker.ReportProgress(i * 10, "Object userState");// 将触发BackgroundWorker.ProgressChanged事件,向ProgressChanged报告进度}}e.Result = "结束";
}

RunWorkerCompleted事件:当DoWork事件处理完成之后,将会触发该事件。

private void backgroundWorker1_RunWorkerCompleted(object sender, System.ComponentModel.RunWorkerCompletedEventArgs e)
{//e.Cancelled指示异步操作是否已被取消//e.Error 指示异步操作期间发生的错误//e.Result 获取异步操作结果的值,即DoWork事件中,Result设置的值。if (e.Cancelled == true){resultLabel.Text = "Canceled!";}else if (e.Error != null){resultLabel.Text = "Error: " + e.Error.Message;}else{resultLabel.Text = e.Result.ToString();}
}

ProgressChanged事件:ProgressChanged事件处理程序的第二个参数e有一个ProgressPercentage属性,它就由                          ReportProgress的第一个参数percentProgress来提供。这个参数一般用来报告该后台操作完成的进度,然后用                        ProgressChanged的第二个参数e的ProgressPercentage属性来获取该进度信息。如果用户还想传递更多的信息,可以使用      ReportProgress的第二种重载,它的第二个参数userState将会传递给ProgressChanged事件的参数e的UserState属性。

private void backgroundWorker1_ProgressChanged(object sender, System.ComponentModel.ProgressChangedEventArgs e)
{//e.ProgressPercentage  获取异步操作进度的百分比resultLabel.Text = (e.ProgressPercentage.ToString() + "%");string state = (string)e.UserState;//接收ReportProgress方法传递过来的userState
}

4、按钮事件

 //开始按钮
private void btnStart_Click(object sender, EventArgs e)
{if (backgroundWorker1.IsBusy != true)//判断BackgroundWorker 是否正在运行异步操作。{// Start the asynchronous operation.backgroundWorker1.RunWorkerAsync("object argument");//启动异步操作,有两种重载。将触发BackgroundWorker.DoWork事件}
}//终止
private void btnEnd_Click(object sender, EventArgs e)
{if (backgroundWorker1.WorkerSupportsCancellation == true){// Cancel the asynchronous operation.backgroundWorker1.CancelAsync(); //请求取消挂起的后台操作。调用该方法将使BackgroundWorker.CancellationPending属性设置为True。 }
}

C#中backgroundworker的使用相关推荐

  1. c#中BackGroundWorker控件

    一.BackGroundWorker工作步骤 1.向窗体中拖入一个BackGroundWorker控件. 2.在某个方法或者事件中,调用BackGroundWorker的RunWorkerAsync( ...

  2. C#中BackgroundWorker的介绍

    BackgroundWorker可以解决执行耗时操作界面无法响应的问题,另外也提供异步操作取消以及下载进度报告等:它常用的属性有: (1).CancellationPending属性,用来指示应用程序 ...

  3. Winform中封装DevExpress的MarqueeProgressBarComtrol实现弹窗式进度条效果

    场景 在Winform中实现弹窗式进度条 新建一个窗体,然后在窗体中加入进度条控件,然后在触发进度条的事件中将加载进度报告给进度条控件. 注: 博客主页: https://blog.csdn.net/ ...

  4. C BackgroundWorker类详细说明

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! Back ...

  5. c#中的委托、事件、Func、Predicate、Observer设计模式以及其他

    原文地址:[学习笔记]c#中的委托.事件.Func.Predicate.Observer设计模式以及其他 参考资料: 1. 简单谈谈事件与委托 2. C#中的委托和事件(上) 3. C#中的委托和事件 ...

  6. 1.[C# Winform]BackgroundWorker实现进度条的那点事儿

    学习笔记01 公司前辈让我用C#winform结构来逐步实现一个他曾经写过的配置程序的批处理文件的所有功能.设计什么的就不说了,就是俩字简洁. 直接上过程. 小助手主页面 取消了最大化功能的小助手,如 ...

  7. CC#中List用法介绍详解学习通http://www.bdgxy.com/roundWorker类用法总结学习通http://www.bdgxy.com/

    文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...

  8. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  9. C# 异步编程模式 APM、EAP、TPL

    目录 异步编程模式 APM异步编程模型 APM的本质 APM的实现 读取的同步方法: BeginXxx方法--读取的异步方法: EndXxx方法--结束异步操作 异步调用的结果--与IAsyncRes ...

  10. 面试:第十二章:所有总结

    Java基础 java基本类型哪些,所占字节 byte :1个字节 short :2个字节 char :2个字节 int :4个字节 long :8个字节 float :4个字节 double :8个 ...

最新文章

  1. 实现图片预览效果及模糊效果
  2. 浅说国际根域名服务器与中国电信的镜像服务器
  3. android系统源代码添加新产品的支持
  4. 学习Qt的资源-网站、论坛、博客等
  5. 互联网1分钟 |1019
  6. python-opencv学习第二章
  7. android+动画完成后不可点击,动画后,TranslateAnimated ImageView无法点击[Android]
  8. MFC中使用自定义消息 .
  9. vuex 在typescript中的写法
  10. 【C++】指针与引用的区别
  11. pc电脑版java模拟器下载安装_PC电脑版java模拟器
  12. 三维CAD/CAM软件SINOVATION 10 中文注册版
  13. delphi IDE插件 cnpack 使用记录
  14. css让图片img水平居中-行内元素居中
  15. 用matlab实现“太阳-地球-月亮运行示意图”动画
  16. 配置华为防火墙接口IP地址和区域
  17. codeforces 129E/128C Games with Rectangle
  18. 2021-05-11PLC通信Libnodave-明天继续
  19. 数据报表常用excel公式
  20. 密码库LibTomCrypt学习记录——(2.25)分组密码算法的工作模式——EAX加密认证模式

热门文章

  1. 学业水平测试计算机知识点,2021高中学业水平考试信息技术知识点
  2. 高通 SPI驱动笔记
  3. CSS颜色代码 颜色值 颜色名字大全
  4. spyder python_spyder python2.7下载
  5. 解决google浏览器自动播放问题,亲测可用!!
  6. 机器视觉工业光源知识总结
  7. 【Pix4d精品教程】打开Pix4DMapper时提示Pix4DMapper.exe已停止工作的完全解决办法
  8. matlab生成16进制正弦波表
  9. creo数控编程怎么样_CREO数控编程NC图文教程 -
  10. 如果A为假,则蕴含A-B恒为真