C# BackgroundWorker组件学习
C# BackgroundWorker组件学习
一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.
BackgroundWorker类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。
BackgroundWorker类方便地解决问题(MSDN)。
BackgroundWorker,
BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗
口中(MSDN)。
属性:
BackgroundWorker 是否正在运行异步操作。
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();
}
}
}
} |
运行结果:
C# BackgroundWorker组件学习
一个程序中需要进行大量的运算,并且需要在运算过程中支持用户一定的交互,为了获得更好的用户体验,使用BackgroundWorker来完成这一功能.
BackgroundWorker类允许您在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 似乎处于停止响应状态。
BackgroundWorker类方便地解决问题(MSDN)。
BackgroundWorker,
BackgroundWorker,则它会出现在组件栏中,而且它的属性会显示在“属性”窗
口中(MSDN)。
属性:
BackgroundWorker 是否正在运行异步操作。
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();
}
}
}
} |
运行结果: