在我的C#程序中,我有一个表示正在运行的测试的线程,可以通过单击标记为“中断执行”的按钮来中止该测试。为了使线程(以及因此测试)以优雅的方式终止(并且事先做一些重要的工作),这个按钮仅在一些明确定义的时刻启用,我抓住ThreadAbortedException
,执行{ {1}}并且精美地死去(也就是说,线程)。
问题在于,在可以中止的时间窗口中,一旦启动就需要从头到尾完成一些任务,因此,我担心TAE。锁没有为此提供解决方案,虽然最后有块,但我发现以下列方式包装重要代码并不优雅:
Thread.ResetAbort()
但是,我没有找到任何其他解决方案。
这是另一种延迟try {
} finally {
// vital code
}
干扰直到阻塞结束的方法吗?
答案 0 :(得分:4)
生成ThreadAbortException的情况可能很复杂。一个更好的选择可能是问你为什么要使用ThreadAbortExceptions。
更好的模式是简单地使用一个标志来指示正在运行的线程它应该中止,然后在它工作时定期测试该标志。如果已设置,则可以在此时抛出异常。
使用这种模式,您可以完全控制线程何时作用于中止,而不必担心关键操作被中断。
答案 1 :(得分:3)
使用Thread.BeginCriticalRegion()
通知主机执行即将进入代码区域,其中线程中止或未处理异常的影响可能会危及应用程序域中的其他任务。
Thread.BeginCriticalRegion()
//do important stuff here
Thread.EndCriticalRegion()