关闭

C#BackgroundWorker类详细说明

标签: textboxwinform工具ui多线程工作
12226人阅读 评论(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
查看评论

非常实用的C# backgroundworker使用方法

<br /># BackgroundWorker 控件的几个实例(C# backgroundworker使用方法):<br />在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。<br />解决的方法就是新开一...
  • songkexin
  • songkexin
  • 2011-02-11 11:35
  • 39085

C# BackgroundWorker分析以及使用

namespace System.ComponentModel {     //     // 摘要:     //    ...
  • u012343179
  • u012343179
  • 2016-07-16 11:38
  • 788

C# BackGroundWorker 的简单使用

<br /> <br />在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。<br />解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。<br /&g...
  • kenkao
  • kenkao
  • 2010-06-23 10:37
  • 3268

C# 使用BackgroundWorker例子及注意点

该例子为使用BackgroundWorker在TextBox文本中产生一个10000以内并且能被5整除的数(1秒产生一个)操作界面可以启动线程,也可以停止线程,界面设计如图:  先贴代码,有注释的地方就不解释了。 整个Form1窗体代码如下引入命名空间:using Sy...
  • Andrew_wx
  • Andrew_wx
  • 2011-07-18 19:40
  • 15115

【C#】BackgroundWorker类传递参数

传递多个不同类型的参数
  • qq_18995513
  • qq_18995513
  • 2017-02-15 10:04
  • 1264

BackgroundWorker的参数传递

private void btnPicUp_Click(object sender, EventArgs e)         {                  ...
  • zhu3082104111
  • zhu3082104111
  • 2017-05-15 15:31
  • 450

BackgroundWorker使用方法样例介绍 C#

BackgroundWorker使用方法: 关键代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing;...
  • nieweiking
  • nieweiking
  • 2014-12-12 00:28
  • 1302

C#多线程 BackgroundWorker类使用小例-控制台程序

1. 示例程序 是一个控制台应用程序,程序实现了分别在主线程和后台线程并行执行,达到为数组的赋值效果。   可以中途停止后台线程。 2. 执行结果图片如下: 正常执行结束: 中途停止后台线程: 3.代码 using System; using System.Collectio...
  • xuanwuziyou
  • xuanwuziyou
  • 2014-12-03 17:12
  • 1808

C#: 自己写的一个类似BackGroundWorker的类

http://blog.163.com/chs1987@126/blog/static/68709178201110149343148/?suggestedreading&wumii 用了BackGroundWorker一段时间,发现自己还是没有掌握它的精髓,很不爽。更...
  • mosangbike
  • mosangbike
  • 2017-01-11 09:34
  • 377

BackgroundWorker 小结

在 WinForms 中,有时要执行耗时的操作,在该操作未完成之前操作用户界面,会导致用户界面停止响应。 解决的方法就是新开一个线程,把耗时的操作放到线程中执行,这样就可以在用户界面上进行其它操作。 新建线程可以用 Thread 类,可以实现多线程同时操作,简单的可以通过 BackgroundW...
  • clb929
  • clb929
  • 2017-02-12 22:12
  • 116
    个人资料
    • 访问:3549985次
    • 积分:36054
    • 等级:
    • 排名:第137名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3424条
    个人说明
    联系方式:
    文章存档
    最新评论