C# 使用BackgroundWorker例子及注意点
该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个)
操作界面可以启动线程,也可以停止线程,界面设计如图:

先贴代码,有注释的地方就不解释了。
先引入命名空间:using System.Threading; using System.Net;
整个Form1窗体代码如下:
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 事件中与界面长须打交道,把生产的随机整数显示到窗体上。
界面编译后运行如图:

C# 使用BackgroundWorker例子及注意点的更多相关文章
- c# BackGroundWorker 多线程操作的小例子
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- c# BackGroundWorker 多线程操作的小例子 (转)
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- C# 多線程&BackgroundWorker概念入門教程
感謝以下各位作者的貢獻~ 百度經驗舉了個例子,很好理解BackgroundWorker的用途(主要是用來啟動後台線程,而不阻塞調用程式的運行),收藏一下 http://jingyan.baidu.c ...
- C#在后台运行操作:BackgroundWorker的用法
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- WPF线程(Step2)——BackgroundWorker
在WPF中第二个常用的线程处理方式就是BackgroundWorker. 以下是BackgroundWorker一个简单的例子. public partial class MainWindow : W ...
- BackgroundWorker控件
在我们的程序中,经常会有一些耗时较长的运算,为了保证用户体验,不引起界面不响应,我们一般会采用多线程操作,让耗时操作在后台完成,完成后再进行处理或给出提示,在运行中,也会时时去刷新界面上的进度条等显示 ...
- (转)C# 使用BackgroundWorker
本文转载自:http://blog.csdn.net/andrew_wx/article/details/6615077 该例子为使用BackgroundWorker在TextBox文本中产生一个10 ...
- BackgroundWorker组件学习
今天看到别人的博客中提到了BackgroundWorker组件.在现在的系统中有见到过这个组件,由于实际应用的系统中逻辑比较复杂所以也没深入去看.今天凑巧看到了一个关于BackgroundWorker ...
- 使用BackgroundWorker组件进行异步操作编程
本文介绍了BackgroundWorker组件的功能及在基于事件的异步操作编程中的应用,并对组件的实现原理进行简述.在应用程序中,可能会遇到一些执行耗时的功能操作,比如数据下载.复杂计算及数据库事务等 ...
随机推荐
- About_PHP_函数
关于验证码的完善: //生成干扰线 $posLineX1 = rand(12,50); $posLineX2 = rand(50,110); $posX = rand(10,50); for($i=0 ...
- 客户端JavaScript-如何执行
客户端JavaScript程序有四部分:内联脚本.HTML事件处理程序.URL中的JavaScript.外联脚本:所有这些单独的代码共用同一个全局Window对象,它们可以看到相同的Document对 ...
- jQuery实现的简单小功能(实用)
1.返回顶部使用JQuery的animate和scrollTop方法可以创建简单地返回顶部的动画: // Back to top $('#top').click(function (e) { e.pr ...
- android——判断网络状态
平常我们玩qq的时候我们没联网 ,qq上面回显示"网络连接不给力,请检查网络连接"那么它是 通过什么方式判断网络是否连接的呢? 下面将写个案例展示如何检查网络连接状态的 由于我们这 ...
- java类,接口浅谈
一般类,抽象类,接口的使用场景: 类;共同的特征和行为的抽取和封装 接口:标准,规范(功能的扩展) 需要对某个类进行功能的扩展,就让某个类实现这个接口,抽取出来称为接口 内部类: ...
- jQuery 判断页面元素是否存在的代码
在原生的Javascript里,当我们对某个页面元素进行某种操作前,最好先判断这个元素是否存在.原因是对一个不存在的元素进行操作是不允许的. 例如: document.getElementById(& ...
- poj1753
#include <stdio.h> char s[100][100]; int s1[100][100]; int ax[5]={0,-1,0,1,0}; int ay[5]={0,0, ...
- IE 6 ~ 9 CSS Hack 写法总结
IE 6 ~ 9 CSS Hack 写法总结 24th 四, 14 lip2up [code lang="css"]_color: red; /* ie6 */*color: ...
- Android中,Context,什么是Context?
注:本文翻译自Context, What Context?,原文链接在这里,作者是Dave Smith.ps:译者链接http://blog.csdn.net/race604/article/deta ...
- async 和 await 的进阶
异常的捕获: static void Main(string[] args) { //继续我们的异步编程的使用嘀呀: //关于主线程是无法捕获我们子线程中的异常滴滴啊: var t = DoExcep ...