2008-09-06 79 views
2

在我的C#程序中,我有一个代表正在运行的测试的线程,可以通过单击标有“中断执行”的按钮来中止它。为了使线程(因此测试)以优雅的方式终止(并且事先做一些重要的工作),该按钮仅在一些明确定义的时刻被启用,其中我抓住ThreadAbortedException,做Thread.ResetAbort()并且精美地死(即线程)。有没有办法确保在.NET线程中执行完整的代码块?

问题是,在可能中止的时间窗口中,有一些任务需要在开始时从头到尾完成,因此,我担心TAE。锁不提供这样的解决方案,而且,虽然finally块做的,我不觉得它优雅在下列方式包装的重要代码:

try { 
} finally { 
    // vital code 
} 

但是,我没有发现任何其他的解决办法。

这是否延迟ThreadAbortException的干扰直到块结束?

回答

4

将生成ThreadAbortException的情况可能很复杂。更好的选择可能是问你为什么使用ThreadAbortExceptions。

更好的模式是简单地使用一个标志来指示正在运行的线程应该中止,然后在它正在工作时定期测试该标志。如果已设置,则可以在此时抛出异常。

有了这种模式,您完全可以控制线程何时执行中止操作,并且不必担心被中断的关键操作。

3

使用Thread.BeginCriticalRegion()

通知主机执行即将进入的代码,其中一个线程的影响,中止或者未处理的异常区域可能危及在应用领域的其他任务。

Thread.BeginCriticalRegion() 

//do important stuff here 

Thread.EndCriticalRegion() 
+0

虽然BeginCriticalRegion()可能在某种程度上,保证执行代码,因为您的应用程序可能会停止,否则,我想它不允许ThreadAbortExceptions打断我的代码的设备。 – 2008-09-17 17:16:57

相关问题