博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 使用BackgroundWorker例子及注意点
阅读量:7080 次
发布时间:2019-06-28

本文共 2485 字,大约阅读时间需要 8 分钟。

该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个)

操作界面可以启动线程,也可以停止线程,界面设计如图:

 

先贴代码,有注释的地方就不解释了。

 

整个Form1窗体代码如下

引入命名空间:

using System.Threading;  using System.Net;

 

完整代码:

namespace BackgroundWorkerExample  {  public partial class Form1 : Form      {  public Form1()          {              InitializeComponent();              backgroundWorker1.WorkerReportsProgress = true;              backgroundWorker1.WorkerSupportsCancellation = true;              btn_Stop.Enabled = false;          }  private void btn_Start_Click(object sender, EventArgs e)          {              txt_Text.Text = "开始产生10000以内的随机数……\n\n";              btn_Start.Enabled = false;              btn_Stop.Enabled = true;  //在后台线程开始操作              backgroundWorker1.RunWorkerAsync();          }  private void btn_Stop_Click(object sender, EventArgs e)          {              backgroundWorker1.CancelAsync();              btn_Stop.Enabled = false;              btn_Start.Enabled = true;          }  private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)          {  //不要直接使用组件实例名称(backgroundWorker1),因为有多个BackgroundWorker时,  //直接使用会产生耦合问题,应该通过下面的转换使用它              BackgroundWorker worker = sender as BackgroundWorker;  //下面的内容相当于线程要处理的内容。//注意:不要在此事件中和界面控件打交道              Random r = new Random();  int numCount = 0;  while (worker.CancellationPending == false)              {  int num = r.Next(0, 10000);  if (num % 5 == 0)                  {                      numCount++;                      worker.ReportProgress(0, num);                      Thread.Sleep(1000);                  }              }              e.Result = numCount;          }  private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)          {  int num = (int)e.UserState;              txt_Text.Text += num + " ";          }  private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)          {  if (e.Error == null)                  txt_Text.Text += "\n\n操作停止,共生产" + e.Result + "个能被5整除的随机数";  else                  txt_Text.Text += "\n操作过程中产生错误:" + e.Error;          }      }  }

 

   该例子在 Backgroundworker 组件的辅助线程上随机产生整数,辅助线程运行DoWork事件处理程序,当产生能被5整除的整数时,使用ProgressChanged事件把整数显示到窗体上。程序执行到 RunWorkerAsync 方法时,将启动后台线程。 在Dowork事件中,如果应用程序没有取消后台操作,将不停的产生随机整数,然后判断该整数能否被5整除,如果能被5整除,执行work.ReportProgress方法来触发 ProgressChanged 事件,在 ProgressChanged 事件中与界面长须打交道,把生产的随机整数显示到窗体上。

参考:

转载于:https://www.cnblogs.com/andrew-blog/archive/2011/12/02/Backgroundworker.html

你可能感兴趣的文章
前端MVC Vue2学习总结(一)——MVC与vue2概要、模板、数据绑定与综合示例
查看>>
Linux安装mysql5.6
查看>>
kafka 主要内容介绍
查看>>
VirtualBox下安装ubuntu server 16.04
查看>>
VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
查看>>
Linux获取网页源码的几种方法
查看>>
write a python http server & client
查看>>
并非全部的程序猿都适合做技术管理
查看>>
jQuery 效果 - 淡入淡出
查看>>
SSDB图形界面管理工具:phpssdbadmin安装部署
查看>>
how to backup and restore database of SQL Server
查看>>
Hibernate- QBC查询方式
查看>>
【Linux】linux查看日志文件内容命令tail、cat、tac、head、echo
查看>>
php中的或运算
查看>>
位图(BitMap)索引
查看>>
CSS3伪类和伪元素的特性和区别
查看>>
vue实现文章内容过长点击阅读全文功能
查看>>
记一次elementUI Icon 加载无效的问题。并且提示错误 Failed to decode downloaded font:
查看>>
OpenGL之位图的绘制和gluOrtho2D等函数详解
查看>>
Linux磁盘概念及其管理工具fdisk
查看>>