在我们平时的开发中,有使用需要执行有些比较耗时的任务(比如说插入10000条数据到数据库或进行一些比较常时间的IO操作),如果我们在主线程中直接执行该任务的话,可能会使整个界面处于假死状态.这对用户来说是一个很不好的体验,作为一个合格的程序员,绝对不能停留在“程序能用就行”的境界,而是应该充分考虑用户的体验以及界面的友好性,把软件做成一个精品。
针对由于任务比较耗时而情况,传统的做法是使用多线程进行处理。将耗时的任务在单独的线程中进行处理,在任务的执行过程中,将执行的进度通过委托调用主线程的方法,将进度在界面显示给用户(在VS2005中,出于安全考虑,在线程中无法直接操作主线程上的控件,只能通知主线程,由主线程对其控件的状态进行修改)。
一、BackGroundWorker介绍
在VS2005中,为我们提供的BackGroundWorker就可以很好地为我们解决这方面的问题。即使你对多线程编程不熟悉,也可以很好地利用BackGroundWorker完成一些多线程才能完成的工作(其实BackGroundWorker在后台也是采用多线程进行工作的)。你可以把耗时的方法放在BackGroundWorker中的DoWork方法中执行,然后,通过ReportProgress方法来向主线程报告操作的进度。
二、BackGroundWorker的使用介绍
我们先来看看一个使用BackGroundWorker的DEMO,如下图:
DEMO 实现得很简单,当点“开始执行”按钮时,该软件开始执行一个耗时的动作,然后在界面显示操作的进度。我们看看Demo的代码:
DEMO全部代码
<!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->1publicpartialclassForm1:Form
2
3{
4
5publicForm1()
6
7{
8
9InitializeComponent();
10
11}
12
13
14
15/**////<summary>
16
17///模拟一个耗时的方法(让线程休眠一秒)
18
19///</summary>
20
21privatevoidGetData()
22
23{
24
25System.Threading.Thread.Sleep(1000);
26
27}
28
29
30
31/**////<summary>
32
33///开始执行按钮动作
34
35///</summary>
36
37///<paramname="sender"></param>
38
39///<paramname="e"></param>
40
41privatevoidbtn_Start_Click(objectsender,EventArgse)
42
43{
44
45if(!backgroundWorker1.IsBusy)//如果DoWork处于不忙状态,才执行该方法
46
47{
48
49//开始执行异步工作
50
51backgroundWorker1.RunWorkerAsync();
52
53}
54
55}
56
57/**////<summary>
58
59///加载的方法
60
61///</summary>
62
63///<paramname="sender"></param>
64
65///<paramname="e"></param>
66
67privatevoidForm1_Load(objectsender,EventArgse)
68
69{
70
71backgroundWorker1.WorkerReportsProgress=true;//声明异步执行的时候可以报告进度
72
73
74
75backgroundWorker1.WorkerSupportsCancellation=true;//声明可以异步取消
76
77
78
79}
80
81/**////<summary>
82
83///backgroundWorker的核心事件1,执行耗时的操作就在个方法里执行
84
85///</summary>
86
87///<paramname="sender"></param>
88
89///<paramname="e"></param>
90
91privatevoidbackgroundWorker1_DoWork(objectsender,DoWorkEventArgse)
92
93{
94
95
96
97
98
99//模拟100次的执行耗时动作
100
101for(inti=0;i<100;i++)
102
103{
104
105if(backgroundWorker1.CancellationPending)
106
107{
108
109//直接告诉程序已经执行完了,在实际的项目中,我们可以在界面显示“强行终止”
110
111backgroundWorker1.ReportProgress(0,"强行终止");
112
113break;
114
115}
116
117GetData();
118
119//向主线程报告进度(我们将i当作进度传递给主线程,当循环1次,我们就当做完成1%的工作,并报告给主线程)
120
121backgroundWorker1.ReportProgress(i,"");
122
123
124
125}
126
127
128
129}
130
131/**////<summary>
132
133///backgroundWorker的核心事件2,用于接收DoWork方法执行过程中的情况
134
135///</summary>
136
137///<paramname="sender"></param>
138
139///<paramname="e"></param>
140
141privatevoidbackgroundWorker1_ProgressChanged(objectsender,ProgressChangedEventArgse)
142
143{
144
145//接收DoWork传送过来的数据,并在界面上显示
146
147if(e.UserState.ToString()=="")
148
149{
150
151this.lbl_State.Text=e.ProgressPercentage.ToString()+"%";
152
153}
154
155else{
156
157this.lbl_State.Text=e.UserState.ToString();
158
159}
160
161
162
163}
164
165/**////<summary>
166
167///backgroundWorker的核心事件3,当DoWork方法执行完毕时调用
168
169///</summary>
170
171///<paramname="sender"></param>
172
173///<paramname="e"></param>
174
175privatevoidbackgroundWorker1_RunWorkerCompleted(objectsender,RunWorkerCompletedEventArgse)
176
177{
178
179//DoWork执行完时自动调用该方法进行报告
180
181
182
183
184
185}
186
187/**////<summary>
188
189///取消异步执行的方法
190
191///</summary>
192
193///<paramname="sender"></param>
194
195///<paramname="e"></param>
196
197privatevoidbtn_Stop_Click(objectsender,EventArgse)
198
199{
200
201if(backgroundWorker1.IsBusy)//如果DoWork处于忙状态,才执行该方法
202
203{
204
205//开始执行异步工作
206
207backgroundWorker1.CancelAsync();
208
209}
210
211}
212
213}
214
三、BackGroundWorker使用总结
方法:
backgroundWorker1.CancelAsync() 用于取消异步执行
backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度
backgroundWorker1.RunWorkerAsync():用于开始执行异步操作
属性:
backgroundWorker1.IsBusy后台是否会执行
backgroundWorker1.WorkerReportsProgress 声明异步执行时是否可以报告进度
backgroundWorker1.WorkerSupportsCancellation 声明是否可以异步取消
backgroundWorker1.CancellationPen
分享到:
相关推荐
C# backgroundWorker控件使用C# backgroundWorker控件使用C# backgroundWorker控件使用C# backgroundWorker控件使用C# backgroundWorker控件使用C# backgroundWorker控件使用
使用BackgroundWorker控件的过程通常包括以下几个步骤: 1. **初始化控件**:首先,在设计时或代码中创建一个BackgroundWorker对象,并设置其属性,如WorkerReportsProgress和WorkerSupportsCancellation,分别表示...
本篇将详细介绍BackGroundWorker控件的基本概念、使用方法以及如何在实际项目中应用。 一、BackGroundWorker控件简介 BackGroundWorker控件是.NET Framework提供的,用于在单独的线程上执行长时间运行操作的组件,...
综上所述,`VB.NET BackgroundWorker`的使用涉及事件绑定、任务启动、取消操作以及进度报告等多个方面,它是实现异步编程,保持用户界面流畅的关键工具。通过实践和学习提供的"VB.net BackgroundWorker使用例子",...
下面将详细阐述`BackgroundWorker`控件的原理、使用方法以及其在范例中的应用。 ### `BackgroundWorker`控件概述 `BackgroundWorker`控件是异步编程模型的一种实现,主要用于解决多线程问题。在单线程UI应用中,...
在C#中,BackgroundWorker控件允许在单独的专用线程上运行操作。 耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面(UI)似乎处于停止响应状态。如果需要能进行响应的用户界面,而且面临与这类操作...
本文将通过一个简单的实例,详细介绍如何在WinForm中使用`BackgroundWorker`控件。 首先,`BackgroundWorker`控件的核心在于其事件模型,主要包括三个主要事件: 1. `DoWork`事件:这个事件在后台线程上触发,用于...
由于没有具体的代码细节,我们可以假设这是一个使用`BackGroundWorker`加载网页并显示进度的场景。在`DoWork`事件中,可能包含了使用WebClient或HttpClient类下载网页内容的过程。在下载过程中,`ReportProgress`...
C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用,BackgroundWorker ,实现,后台操作窗体 C#,使用...
在本篇内容中,我们将深入探讨`BackgroundWorker`的使用方法,以及如何结合`ProgressBar`来提供用户反馈。 首先,我们需要了解`BackgroundWorker`的基本原理。`BackgroundWorker`类提供了异步执行操作的能力,这...
6. **线程安全**:由于 `BackgroundWorker` 在后台线程上运行,所有对 UI 控件的操作都必须在主线程中进行。使用 `Control.Invoke` 或 `Control.BeginInvoke` 方法将后台线程的结果安全地传递到 UI 线程。 在实际...
BackgroundWorker 组件是 VS2005 和 VS2008 中添加的一个多线程编程控件,该控件使用起来非常方便,然而在开始时由于没有搞清楚它的使用机制,走了不少的弯路。下面是 BackgroundWorker 类中主要用到的属性、方法和...
《Visual C# 2008控件使用范例详解》是一本专注于C#编程语言在Windows应用程序开发中的实践指南,特别关注了控件的使用。这本书提供的全套代码旨在帮助开发者深入理解C#中各种控件的功能、用法以及如何在实际项目中...
本例子将深入讲解如何正确使用BackgroundWorker组件,包括其主要属性、方法和事件。 首先,BackgroundWorker组件有以下几个关键属性: 1. **IsBusy**:这个布尔属性用于检查BackgroundWorker是否正在执行工作。当...
C# BackgroundWorker 使用方法 C# BackgroundWorker 是一个非常有用的组件,可以帮助开发者在 Windows 窗体应用程序中执行耗时的操作,避免了界面的冻结和卡顿。下面将详细介绍 C# BackgroundWorker 的使用方法。 ...
- 因为`BackgroundWorker`在后台线程运行,所以不能直接修改UI控件,必须通过`Invoke`或`BeginInvoke`方法确保在正确的线程上下文中操作。 - 避免在`DoWork`事件中进行任何可能引起UI交互的操作,否则可能导致异常...
5. **线程安全**:`BackgroundWorker`确保了与UI交互的安全性,因为它使用事件和委托来通信,而不是直接访问UI控件,这样避免了线程同步的问题。 下面是一个简单的`BackgroundWorker`示例: ```csharp public ...
2. **UI更新挑战**:由于跨线程访问UI控件是不安全的,你需要使用Control.Invoke或Control.BeginInvoke来确保在UI线程上执行更新操作,这增加了代码的复杂性。 3. **错误处理**:异常处理需要手动实现,通常需要捕获...
通过使用`BackgroundWorker`,开发者可以轻松地实现异步处理,并通过`ProgressChanged`事件更新UI,比如滚动条,来提供任务进度的可视化反馈。这不仅可以改善用户对应用程序的感知,还能防止长时间操作导致的UI冻结...