C# BackgroundWorker组件学习

本文介绍如何利用BackgroundWorker类解决耗时操作导致的UI响应迟钝问题,通过实例演示了如何实现进度报告及取消操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/GaoHuhu/p/3359340.html


一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.     

 

        BackgroundWorker类允许您在单独的专用线程上运行操作。  耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。

  如果您需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用 BackgroundWorker类方便地解决问题(MSDN)。 

 

        若要在后台执行耗时的操作,请创建一个 BackgroundWorker,侦听那些报告操作进度并在操作完成时发出信号的事件。  可以通过编程方式创建 BackgroundWorker

  也可以将它从“工具箱”“组件”选项卡中拖到窗体上。  如果在 Windows 窗体设计器中创建 BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗

  口中(MSDN)。

 

  属性:

 

   IsBusy:获取一个值,指示 BackgroundWorker 是否正在运行异步操作。

   WorkerReportsProgress:获取或设置一个值,该值指示 BackgroundWorker 能否报告进度更新。

   WorkerSupportsCancellation:获取或设置一个值,该值指示 BackgroundWorker 是否支持异步取消。

 

   事件:

 

   DoWork:调用 RunWorkerAsync 时发生。

   ProgressChanged:调用 ReportProgress 时发生。

   RunWorkerCompleted:当后台操作已完成、被取消或引发异常时发生。

 

   实例:

 

   窗体设计如下图:

  

 

 

   代码实现:

  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
using  System;
using  System.Collections.Generic;
using  System.ComponentModel;
using  System.Data;
using  System.Drawing;
using  System.Linq;
using  System.Text;
using  System.Threading.Tasks;
using  System.Windows.Forms;
 
namespace  WindowsFormsApplication2
{
     public  partial  class  Form1 : Form
     {
         public  Form1()
         {
             InitializeComponent();
             backgroundWorker1.WorkerReportsProgress = true ;
             backgroundWorker1.WorkerSupportsCancellation = true ;
         }
 
         private  void  backgroundWorker1_DoWork( object  sender, DoWorkEventArgs e)
         {
             BackgroundWorker worker = sender as  BackgroundWorker;
 
             for  ( int  i = 1; i <= 12; i++)
             {
                 if  (worker.CancellationPending == true )
                 {
                     e.Cancel = true ;
                     break ;
                 }
                 else
                 {
                     System.Threading.Thread.Sleep(500);
                     worker.ReportProgress(i * 10);
                 }
             }
         }
 
         private  void  backgroundWorker1_ProgressChanged( object  sender, ProgressChangedEventArgs e)
         {
             lbResult.Text = (e.ProgressPercentage.ToString() + "%" +e.UserState);
         }
 
         private  void  backgroundWorker1_RunWorkerCompleted( object  sender, RunWorkerCompletedEventArgs e)
         {
             if  (e.Cancelled == true )
             {
                 lbResult.Text = "Canceled!" ;
             }
             else  if  (e.Error != null )
             {
                 lbResult.Text = "Error: "  + e.Error.Message;
             }
             else
             {
                 lbResult.Text = "Done!" ;
             }
         }
 
         private  void  btnStartAsync_Click( object  sender, EventArgs e)
         {
             if  (backgroundWorker1.IsBusy != true )
             {
                 backgroundWorker1.RunWorkerAsync();
             }
         }
 
         private  void  btnCancelAsync_Click( object  sender, EventArgs e)
         {
             if  (backgroundWorker1.WorkerSupportsCancellation == true )
             {
                 backgroundWorker1.CancelAsync();
             }
         }
     }
}

 

 

 

   运行结果:

 

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值