C#3.0核心技术-第19章线程-全新翻译注释-19.10(3)

19.10.3 安全的撤销

中止另外一个线程的替代方法是实现一个模式,工作线程据此周期性地检查一个cancel标志,如果标志为true则退出。为了中止,鼓动者(译者注:即发出中止命令的那个线程)简单地设置标志,然后等待工作线程照着做:

代码视图:

clip_image001

(译者注:相较由其它线程在任意时刻调用被中止线程的Abort方法,由被中止的线程自己调用自己的Abort方法是相关finally块能够被执行的一个有效办法。)

缺点是工作线程的方法必须被写成是明确地支持撤销。虽然如此,这是很少的安全撤销模式之一。

在我们的例子中,在注意到abort字段是true后,工作线程在它自己的线程上调用Abort。这是安全的,因为我们正在从一个已知的位置中止,并且它在执行栈的上端(译者注:工作线程执行到CheckAbort方法的时候退出了(由于抛出的未被捕捉的ThreadAbortException异常),此时CheckAbort方法的相关数据在执行栈,也就是调用栈(calling stack),的最上端)导致了一个优雅的退出(并且没有规避finally块中的代码)(译者注:实际上,即使在任意时刻由另外一个线程调用本线程的Abort方法,也会在本线程执行栈的最上端退出。只不过这个退出不一定再是优雅的,因为可能已经错过了finally块)。抛出一个定制的异常(译者注:即程序员自己定义的异常)也工作的同样好,尽管这样做你必须在你的线程入口方法的最上层捕捉这个异常以避免应用程序关闭(不管怎样,这是一个好主意,(译者注:因为可以使用)任意类型的异常)。

BackgroundWorker帮助类支持一个近似的基于标志的撤销模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值