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 属性得到这个信息对象。

简单实现步聚:

public BackgroundWorker BgWorker = null;

构造函数:

BgWorker = new BackgroundWorker();
BgWorker.DoWork += new DoWorkEventHandler(BgWorker_DoWork);
BgWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(BgWorker_RunWorkerCompleted);
BgWorker.WorkerSupportsCancellation = true;//是否支持异步取消

开始启动:

BgWorker.RunWorkerAsync();

编写相应的函数数据和执行结果。

简单的程序用 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里面储存URL
backgroundWorker1.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函数,用来引发事件ProgressChanged
worker.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;
}
else
MessageBox.Show("操作成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
}

时间: 06-08

C# backgroundworker使用方法的相关文章

【C#】【Thread】BackgroundWorker的使用

BackgroundWorker 可以用于启动后台线程. 主要的事件及参数: 1.DoWork --当执行BackgroundWorker.RunWorkerAsync方法时会触发该事件,并且传递DoWorkEventArgs参数; 2.RunWorkerCompleted --异步操作完成或中途终止会触发该事件. 如果需要提前终止执行后台操作,可以调用BackgroundWorker.CancelAsync方法. 在处理DoWork事件的函数中检测BackgroundWorker.Cancel

WPF 线程 Dispatcher

WPF 应用程序从两个线程开始: 一个用于处理呈现 一个用于管理 UI 呈现线程有效地隐藏在后台运行,而UI线程则接收输入.处理事件.绘制屏幕以及运行应用程序代码. 大多数应用程序都使用一个 UI 线程,但在某些情况下,最好使用多个线程.我们将在后面举例说明这一点. UI 线程对一个名为 Dispatcher 的对象内的工作项进行排队. Dispatcher基于优先级选择工作项,并运行每一个工作项,直到完成.每个UI线程都必须至少有一个Dispatcher,并且每个 Dispatcher 都只能

【翻译】C#中使用BackgroundWorker实现多线程

原文地址:MultiThreading Using a Background Worker, C# 介绍 当开发Windows Forms应用程序时,你会常常注意到:当执行某个耗时的操作,比如处理一个打文件或是从远程服务器请求数据 ,用户界面会进入假死状态.这是由于你的应用程序是运行在单线程下.这个线程负责响应用户界面的操作,同时也负责处理应用程序中所有的事件和方法.因此,耗时的操作会阻塞你的用户界面,直到操作完成.今天,我们将要做的是把这些耗时的操作移到另一个不同的线程中,当以在另一边执行操作

.Net remoting方法实现简单的在线升级(上篇:更新文件)

一.前言:       最近做一个简单的在线升级Demo,使用了微软较早的.Net Remoting技术来练手. 简单的思路就是在服务器配置一个Remoting对象,然后在客户端来执行Remoting对象中的方法. 过程: (1) 读取本地dll文件的名称与版本号,与服务器的进行对比 (2) 确认需要升级的文件名称与版本号并告诉服务器,服务器将其复制到一个临时文件夹并压缩成zip (3) 将服务器的zip下载到本地的临时文件夹,并解压. 定义服务器端为UpdateServer,其配置文件为: <

(转)C# 使用BackgroundWorker

本文转载自:http://blog.csdn.net/andrew_wx/article/details/6615077 该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个) 操作界面可以启动线程,也可以停止线程,界面设计如图: 先贴代码,有注释的地方就不解释了. 整个Form1窗体代码如下 引入命名空间: using System.Threading; using System.Net; 完整代码: namespace Ba

BackgroundWorker与线程使用

在一个程序中,一些耗时的操作,在长时间运行时可能会导致用户界面 (UI) 处于停止响应状态,用户在这操作期间无法进行其他的操作,为了不使UI层处于停止响应状态,需要将这些耗时的操作,设置为后台线程,并且在UI层可以展示后台操作的进度,比较常用的方法有使用线程以及BackgroundWorker类. 1.线程方法 当我们要在前太展示后台的操作进程时,是不允许跨线程访问控件.此时需要取消控件的跨线程访问,在winform中可以设置CheckForIllegalCrossThreadCalls = f

【基础】多线程更新窗体UI的若干方法

一.前言 在单线程中设置窗体某个控件的值很简单的事,只需要设置控件文本的值就可以了,但是有的业务场景很是复杂,界面上的控件也很多,这种情况下当数据量比较多的时候,在单线程中更新UI不可避免地会发生假死或卡顿现象,用户体验十分不爽,所以必须采用多线程来处理数据和UI.但是如果直接添加一个线程来更新控件信息,就会抛出错误,很显然微软并不希望我们这样做,因为UI控件不是线程安全的,如果随意地在任何线程中改变控件的值,会发生各种奇怪的问题,多个线程间会争夺资源,没有秩序地更改控件的值,显然这是我们不想看

【转】【C#利用后台动态加载数据】Winform&ldquo;防界面卡死&rdquo;【BackgroundWorker】类

using System.ComponentModel 直接使用EgProgressBar方法 BackgroundWorker Bw = new BackgroundWorker(); ListView listView1 = new ListView(); public void EgProgressBar() { DirectoryInfo di = new DirectoryInfo(@"C:/Windows"); FileInfo[] fi = di.GetFiles();

C#.NET中使用BackgroundWorker在模态对话框中显示进度条

这里是一个示例,其中展示了如何使用Backgroundworker对象在模态对话框中显示后台操作的实时进度条. 首先是主窗体代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms;