关闭

C#BackgroundWorker类详细说明

标签: textboxwinform工具ui多线程工作
11130人阅读 评论(2) 收藏 举报
分类:

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
0

猜你在找
【直播】机器学习&深度学习系统实战(唐宇迪)
【直播】Kaggle 神器:XGBoost 从基础到实战(冒教授)
【直播回放】深度学习基础与TensorFlow实践(王琛)
【直播】计算机视觉原理及实战(屈教授)
【直播】机器学习之凸优化(马博士)
【直播】机器学习之矩阵(黄博士)
【直播】机器学习之概率与统计推断(冒教授)
【直播】机器学习之数学基础
【直播】TensorFlow实战进阶(智亮)
【直播】深度学习30天系统实训(唐宇迪)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3274317次
    • 积分:33767
    • 等级:
    • 排名:第135名
    • 原创:393篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3370条
    个人说明
    联系方式:
    最新评论