在我编写的一个程序中创建500个Thread后,程序垮掉。然而创建500个BackGroundWorker后,程序就能正常运行。这是为什么呢?
当用户执行一个非常耗时的操作时,如果不借助Thread编程,用户就会感觉界面反映很迟钝。在.Net 2.0中可以通过BackgroundWork非常方便地进行Thread编程,大致的步骤是:
1、调用BackgroundWorker的RunWorkerAsync方法(可以传递参数),它将调用DoWork事件
2、在DoWork的事件响应代码中调用耗时的操作,此例中是PingIPs函数
3、在耗时操作中判断CancellationPending属性,如果为false则退出
4、如果要向用户界面发送信息,则调用BackgroundWorker的ReportProgress方法,它将调用ProgressChanged事件(可以将改变通过object类型传递)
5、在ProgressChanged事件的响应代码中将改变呈现给用户
6、如果需要取消耗时操作,则调用BackgroundWorker的CancelAsync方法,需要和步骤3一起使用

在 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;

  5. 编辑RunWorkerCompleted事件代码:
    工作完成了告诉ui

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;namespace WindowsApplication15
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//textBox1.Text里面储存URLbackgroundWorker1.RunWorkerAsync(textBox1.Text);}private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e){BackgroundWorker bw = (BackgroundWorker)sender;string url = e.Argument.ToString();for (int i = 0; i < 10; i++){//没有取消后台操作if (!bw.CancellationPending){WebRequest req = WebRequest.Create(url);WebResponse resp = req.GetResponse();resp.Close();Thread.Sleep(1000);bw.ReportProgress(i * 100 / 10, i);}}}private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e){progressBar1.Value = e.ProgressPercentage;label1.Text = e.UserState.ToString();}private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){MessageBox.Show("ok!");}}
}

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

http://hi.baidu.com/yebihaigsino/blog/item/eeccbb02fdf1228fd43f7c8a.html 更高级的backgroundworker控件实例应用

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

http://blog.163.com/j_yd168/blog/static/4967972820092114269195/ c# BackGroundWorker 多线程操作的小例子

============ ================这个例子含数据库操作

一、BackGroundWorker工作步骤

1.向窗体中拖入一个BackGroundWorker控件。

2.在某个方法或者事件中,调用BackGroundWorker的RunWorkerAsync()方法。

3.该方法为异步操作,将自动引发BackGroundWorker的DoWork事件。

4.调用ReportProgress方法将引发ProgressChanged事件。

二、一个使用了BackGroundWorker的例子

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.Data.SqlClient;//该用例需要一个名为bgwTestDB的Sql Server数据库
//数据库中应包含tbBgwTest表。
//表中有data1、data2两列。
//数据库中还需要一个存储过程,sql语句如下:namespace winBackgroundWorkerTest
{public partial class backgroundWorkerTest : Form{int count = 30;public backgroundWorkerTest(){InitializeComponent();}private void btnAdd_Click(object sender, EventArgs e){//1.调用bgwInsertData的RunWorkerAsync方法,用来引发DoWork事件bgwInsertData.RunWorkerAsync(count);}private void bgwInsertData_DoWork(object sender, DoWorkEventArgs e){BackgroundWorker worker = sender as BackgroundWorker;//2.在DoWork中调用自定义函数,并将引发DoWork事件的sender传递出去insertData(worker);}private void bgwInsertData_ProgressChanged(object sender, ProgressChangedEventArgs e){progressBar1.Value = e.ProgressPercentage;}//自定义函数 insertData()private void insertData(BackgroundWorker worker){SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial Catalog=bgwTestDB;Integrated Security=True");SqlCommand cmd = new SqlCommand("insertOneData", conn);cmd.CommandType = CommandType.StoredProcedure;cmd.Parameters.Add("data1", SqlDbType.NChar, 10);cmd.Parameters.Add("data2", SqlDbType.Int);for (int i = 0; i < count; i++){try{conn.Open();cmd.Parameters["data1"].Value = i + 1;cmd.Parameters["data2"].Value = i + 1;cmd.ExecuteNonQuery();//3.调用worker的ReportProgress函数,用来引发事件ProgressChangedworker.ReportProgress(i, worker);}catch (Exception ex){MessageBox.Show(ex.Message);}finally{if (conn.State == ConnectionState.Open)conn.Close();}Thread.Sleep(50);}}private void bgwInsertData_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e){if (e.Error != null){MessageBox.Show(e.Error.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Error);return;}else if (e.Cancelled){MessageBox.Show("取消操作!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}elseMessageBox.Show("操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}}
}

backgroundworker与Thread区别相关推荐

  1. Backgroundworker与Thread的区别

    最近项目要用到,窗体Form程序要在后台开启几个子线程,负责和其他端进行通信,异步读写,并且来更改UI.在网上查了有Backgroundworker与Thread两种方法. 1.Backgroundw ...

  2. c#之task与thread区别及其使用

    1.什么是thread 当我们提及多线程的时候会想到thread和threadpool,这都是异步操作,threadpool其实就是thread的集合,具有很多优势,不过在任务多的时候全局队列会存在竞 ...

  3. 【C#】带等待窗体的BackgroundWorker

    [C#]带等待窗体的BackgroundWorker ---------------201504170911更新--------------- 更新内容:删除bgwUI新增的Start方法,改为通过n ...

  4. .net开发中用BackgroundWorker实现多线程

    http://www.111cn.net/net/net/74654.htm BackgroundWorker是?net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作.现在我们 ...

  5. C# BackGroundWorker 的简单使用

    在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应. 解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作. ...

  6. extend Thread 和 implements Runnable

    原文地址:extend Thread 和 implements Runnable 一个Thread的实例只能产生一个线程 or: 同一实例(Runnable实例)的多个线程 look: public ...

  7. BackgroundWorker 实现多线程操作

    背景介绍 在做程序的过程中,我们很可能遇到这样的情况:当我们执行一个比较耗时的操作,即界面加载数据量略大的时,在该操作未完成之前再去操作界面,就会出现停止响应的情况,这称为界面假死状态,那一个小圆圈转 ...

  8. 创建线程的四种方式(Thread、Runnable、线程池、Callable)

    目录 一.直接继承Thread类,然后重写run方法 二.实现Runnable接口 三.线程池创建 四.实现Callable接口 创建线程有四种方式:1.继承Thread类   2.实现Runnabl ...

  9. C#中的线程(三) 使用多线程

    第三部分:使用多线程 1.  单元模式和Windows Forms 单元模式线程是一个自动线程安全机制, 非常贴近于COM--Microsoft的遗留下的组件对象模型.尽管.NET最大地放弃摆脱了遗留 ...

  10. 同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结

    同步上下文(SynchronizationContext) 和 C#中跨线程更新UI的方法总结 在C#编程环境中,不允许在工作线程中直接对主线程(UI线程)中的控件进行更新操作.因此,稍微复杂一点的程 ...

最新文章

  1. Python Qt GUI设计:QTimer计时器类、QThread多线程类和事件处理类(基础篇—8)
  2. IDEA新建maven项目漏掉webapp目录解决方法
  3. Web页面获取用户控件页面中服务器控件的值
  4. 中职计算机属于专业课还是文化课,对中职计算机专业建设探讨.doc
  5. IntelliJ IDEA 偏好设置
  6. 在英特尔架构服务器上构建基于矢量包处理(VPP)的快速网络协议栈
  7. win10 flashcs6不能用了_听说这版win10马上不能用了?那就改装“它”,比win7还稳定流畅...
  8. react-tv-focusable
  9. EtherCAT总线伺服速度控制功能块(H5U PLC)
  10. iconfont矢量图标库的引用方法
  11. GA/GP中的适应度函数
  12. jackson java用法_Jackson 使用方法总结
  13. PMSM矢量控制之RAMP_GEN
  14. android加密设备,用于Android手机的加密设备和加密外部SD卡
  15. CleanMyMac x for Mac系统清理工具简单安装,彻底清理!
  16. python蜂鸣器天空之城频率_用python来一首钢琴solo天空之城
  17. 失眠脑子一直在想事情,试试这些高质量睡眠小妙招
  18. 给Mi5刷个原生安卓系统
  19. r股票数据接口读取CSV文件
  20. 交流桩CP信号充电流程

热门文章

  1. python培训学堂怎么样_如何评价开智学堂开设的课程?
  2. NHOI2019总结
  3. python opencv导入pbtxt文件出现错误Failed to parse GraphDef file
  4. dubbo面试题-dubbo源码解析
  5. 薛定谔教程--生成对接盒子 | Receptor Grid Generation
  6. python数据解析-re、xpath选择器的使用
  7. 在线Cron表达生成器(定时任务时间控制)
  8. 影响因子在10的计算机杂志什么水平,国人无人发表的TOP期刊,影响因子翻倍,5分变10分,不收版面费!...
  9. 最新版计算机应用基础,计算机应用基础课件(最新版)
  10. 汇编语言Loop指令