BackgroundWorker用法示例

BackgroundWorker:

1.定义:是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。

2.使用场景:耗时的操作(如下载和数据库事务)长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。如果我们需要能进行响应的用户界面,而且面临与这类操作相关的长时间延迟,则可以使用BackgroundWorker类方便地解决问题。

3.控件简介:有三个控件

  • DoWork: 在程序中调用RunWorkerAsync会启动DoWork事件处理。
  • ProgressChanged: 在事件处理过程中,调用ReportProgress方法则会启动ProgressChanged事件的事件处理。
  • RunWorkerCompleted: 当DoWork事件处理完成时,则会触发RunWorkerCompleted事件。
  • 注意:在DoWork事件处理程序中不操作任何用户界面对象,否则会停止响应。应该通过ProgressChanged和RunWorkerCompleted事件与用户界面进行通信。

4.示例:

 1 using System;
 2 using System.ComponentModel;
 3 using System.Threading;
 4 using System.Windows.Forms;
 5  
 6 namespace bcworker
 7 {
 8     public partial class Form1 : Form
 9     {
10         //后台工作
11         private BackgroundWorker bw = new BackgroundWorker();
12  
13         public Form1()
14         {
15             InitializeComponent();
16             //后台工作初始化
17             bw.WorkerReportsProgress = true;//报告进度
18             bw.WorkerSupportsCancellation = true;//支持取消
19             bw.DoWork += new DoWorkEventHandler(bgWorker_DoWork);//开始工作
20             bw.ProgressChanged += new ProgressChangedEventHandler(bgWorker_ProgessChanged);//进度改变事件
21             bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgWorker_WorkerCompleted);//进度完成事件
22         }
23  
24         private void btnStart_Click(object sender, EventArgs e)
25         {
26             //后台工作运行中,避免重入
27             if (bw.IsBusy) return;
28             bw.RunWorkerAsync("参数");//触发DoWork事件并异步执行,IsBusy置为True
29         }
30         //后台工作将异步执行
31         public void bgWorker_DoWork(object sender, DoWorkEventArgs e)
32         {
33             //(string)e.Argument == "参数";
34             for (int i = 0; i <= 100; i++)
35             {
36  
37                 if (bw.CancellationPending)
38                 {//用户取消了工作
39                     e.Cancel = true;
40                     return;
41                 }
42                 else
43                 {
44                     bw.ReportProgress(i, "Working");//报告进度,触发ProgressChanged事件
45                     Thread.Sleep(10);//模拟工作
46                 }
47             }
48         }
49         //进度改变事件
50         public void bgWorker_ProgessChanged(object sender, ProgressChangedEventArgs e)
51         {
52             //(string)e.UserState=="Working"
53             progressBar1.Value = e.ProgressPercentage;//取得进度更新控件,不用Invoke了
54         }
55         //后台工作执行完毕,IsBusy置为False
56         public void bgWorker_WorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
57         {
58             //e.Error == null 是否发生错误
59             //e.Cancelled 完成是由于取消还是正常完成
60         }
61  
62         private void btnCancel_Click(object sender, EventArgs e)
63         {
64             if (bw.IsBusy) bw.CancelAsync();//设置CancellationPending属性为True
65         }
66  
67     }
68 }
69 ————————————————
70 版权声明:本文为CSDN博主「AAA张绍山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
71 原文链接:https://blog.csdn.net/donowtop/article/details/79839597

 

posted @ 2022-07-04 09:51  LXLR  阅读(1344)  评论(0编辑  收藏  举报