BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。
若要在后台执行耗时的操作,请创建一个 BackgroundWorker ,侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建 BackgroundWorker ,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker ,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。
若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync 。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。
您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChanged 和 RunWorkerCompleted 事件与用户界面进行通信。
BackgroundWorker 事件不跨 AppDomain 边界进行封送处理。请不要使用 BackgroundWorker 组件在多个 AppDomain 中执行多线程操作。
如果后台操作需要参数,请在调用 RunWorkerAsync 时给出参数。在 DoWork 事件处理程序内部,可以从 DoWorkEventArgs.Argument 属性中提取该参数。
有关 BackgroundWorker 的更多信息,请参见 如何:在后台运行操作 。
摘自:http://msdn.microsoft.com/zh-cn/library/system.componentmodel.backgroundworker%28VS.80%29.aspx
.net 2.0 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.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Net;
using System.Threading;
namespace shua
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click( object sender, EventArgs e)
{
backgroundWorker1.RunWorkerAsync(textBox1.Text);
}
private void backgroundWorker1_DoWork( object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
string url = e.Argument.ToString();
int num = int .Parse(textBox2.Text);
for ( int i = 0 ; i < num; i++)
{
if (!worker.CancellationPending)
{
WebRequest request = WebRequest.Create(url);
WebResponse response = request.GetResponse();
response.Close();
Thread.Sleep( 100 );
worker.ReportProgress(i * 100 / num, i);
}
}
}
private void backgroundWorker1_ProgressChanged( object sender, ProgressChangedEventArgs e)
{
progressBar1.Value = e.ProgressPercentage;
label3.Text = e.UserState.ToString();
}
private void backgroundWorker1_RunWorkerCompleted( object sender, RunWorkerCompletedEventArgs e)
{
MessageBox.Show( "ok" );
}
}
}
摘自:http://blog.youkuaiyun.com/lanwilliam/archive/2008/06/06/2516809.aspx
当要加载大量数据的时候,往往程序界面会卡一会,这时候使用BackgroundWorker来进行后台的操作加载数据就不会使界面卡了,而且还可以调用一个“正在加载”的窗体来更好的来进行交互。不能在DoWork里面调用就是!结束窗体的写在RunWorkerCompleted里面。
参考资料:
1.VS2005中BackgroundWorker组件的使用经验
2.C# BackgroundWorker实现WinForm异步操作的例子
3. 在UI上使用BackgroundWorker