在我们平时的开发中,有使用需要执行有些比较耗时的任务(比如说插入10000条数据到数据库或进行一些比较常时间的IO操作),如果我们在主线程中直接执行该任务的话,可能会使整个界面处于假死状态.这对用户来说是一个很不好的体验,作为一个合格的程序员,绝对不能停留在“程序能用就行”的境界,而是应该充分考虑用户的体验以及界面的友好性,把软件做成一个精品。
针对由于任务比较耗时而情况,传统的做法是使用多线程进行处理。将耗时的任务在单独的线程中进行处理,在任务的执行过程中,将执行的进度通过委托调用主线程的方法,将进度在界面显示给用户(在VS2005中,出于安全考虑,在线程中无法直接操作主线程上的控件,只能通知主线程,由主线程对其控件的状态进行修改)。
一、BackGroundWorker介绍
在VS2005中,为我们提供的BackGroundWorker就可以很好地为我们解决这方面的问题。即使你对多线程编程不熟悉,也可以很好地利用BackGroundWorker完成一些多线程才能完成的工作(其实BackGroundWorker在后台也是采用多线程进行工作的)。你可以把耗时的方法放在BackGroundWorker中的DoWork方法中执行,然后,通过ReportProgress方法来向主线程报告操作的进度。
二、BackGroundWorker的使用介绍
我们先来看看一个使用BackGroundWorker的DEMO,如下图:
DEMO 实现得很简单,当点“开始执行”按钮时,该软件开始执行一个耗时的动作,然后在界面显示操作的进度。我们看看Demo的代码:


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->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

79

80

81


82

83

84

85

86

87

88

89

90

91

92

93



94

95

96

97

98

99

100

101

102

103



104

105

106

107



108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131


132

133

134

135

136

137

138

139

140

141

142

143



144

145

146

147

148

149



150

151

152

153

154

155



156

157

158

159

160

161

162

163

164

165


166

167

168

169

170

171

172

173

174

175

176

177



178

179

180

181

182

183

184

185

186

187


188

189

190

191

192

193

194

195

196

197

198

199



200

201

202

203



204

205

206

207

208

209

210

211

212

213

214

三、BackGroundWorker使用总结
方法:
backgroundWorker1.CancelAsync() 用于取消异步执行
backgroundWorker1.ReportProgress(int ,object)用于向主线层报告进度
backgroundWorker1.RunWorkerAsync():用于开始执行异步操作
属性:
backgroundWorker1.IsBusy后台是否会执行
backgroundWorker1.WorkerReportsProgress 声明异步执行时是否可以报告进度
backgroundWorker1.WorkerSupportsCancellation 声明是否可以异步取消
backgroundWorker1.CancellationPen