当我们处理耗时操作时,为了避免单线程处理时界面的假死状态,我们往往选择将耗时操作放到后台线程里处理,后台线程处理完毕之后通知主线程执行成功。.net中的BackgroundWorker组件实现了后台线程操作的封装,使用起来非常便捷。具体使用的例子园子里有好几篇文章,感兴趣的朋友可以搜一下。今天我主要谈一下,如何在程序执行的过程中“暂停”后台线程的操作。大概的思路是设置一个标志,当用户请求暂停操作时,将该标志设成true,否则未false。然后在后台线程的操作中,在适当的位置检查该标志,如果为true,则暂停后台线程的操作。有一点需要说明的是,这里的“暂停”并不是调用Thread.CurrentThread.Suspend()或Monitor.Wait(object)实现的,这里采用了一种替代方案









由于原理非常简单,废话不多说,直接看代码:


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

这种解决方案其实在BackgroundWorker中已经被应用,当需要请求取消挂起的后台操作时,需要调用BackgroundWorker的CancelAsync()方法。但是,该方法仅仅是将BackgroundWorker的属性CancellationPending属性设为true。位于DoWork()事件中的代码必须在适当的位置检查CancellationPending属性,如果为true,则退出当前程序。基于这个思路,将BackgroundWorker简单的封装一下:


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

这样,当需要暂停后台线程时,直接调用SuspendAsync()方法,然后在适当的位置检查SuspensionPending属性,如果为true,则执行替代方案中的代码。
本人对多线程编程了解不多,这篇随笔仅仅作为一篇开发日志,以方便以后查阅。如果各位有什么更好的解决方案还请不吝赐教。