C#BackgroundWorker类详细说明

BackgroundWorker 类允许您在单独的专用线程上运行操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker 类方便地解决问题。

若要在后台执行耗时的操作,请创建一个 BackgroundWorker ,侦听那些报告操作进度并在操作完成时发出信号的事件。可以通过编程方式创建 BackgroundWorker ,也可以将它从“工具箱”的“组件”选项卡中拖到窗体上。如果在 Windows 窗体设计器中创建 BackgroundWorker ,则它会出现在组件栏中,而且它的属性会显示在“属性”窗口中。

若要设置后台操作,请为 DoWork 事件添加一个事件处理程序。在此事件处理程序中调用耗时的操作。若要启动该操作,请调用 RunWorkerAsync 。若要收到进度更新通知,请对 ProgressChanged 事件进行处理。若要在操作完成时收到通知,请对 RunWorkerCompleted 事件进行处理。

您必须非常小心,确保在 DoWork 事件处理程序中不操作任何用户界面对象。而应该通过 ProgressChangedRunWorkerCompleted 事件与用户界面进行通信。

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; 
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.csdn.net/lanwilliam/archive/2008/06/06/2516809.aspx

 


当要加载大量数据的时候,往往程序界面会卡一会,这时候使用BackgroundWorker来进行后台的操作加载数据就不会使界面卡了,而且还可以调用一个“正在加载”的窗体来更好的来进行交互。不能在DoWork里面调用就是!结束窗体的写在RunWorkerCompleted里面。

参考资料:
1.VS2005中BackgroundWorker组件的使用经验
2.C# BackgroundWorker实现WinForm异步操作的例子
3. 在UI上使用BackgroundWorker


 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值