代码改变世界

BackgroundWorker实现暂停操作

2008-12-24 20:19  3b阿当  阅读(1110)  评论(1)    收藏  举报

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

 

替代方案

 

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

 

Code

 

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

 

简单封装

 

          这样,当需要暂停后台线程时,直接调用SuspendAsync()方法,然后在适当的位置检查SuspensionPending属性,如果为true,则执行替代方案中的代码。

          本人对多线程编程了解不多,这篇随笔仅仅作为一篇开发日志,以方便以后查阅。如果各位有什么更好的解决方案还请不吝赐教。