有没有办法确保在.NET线程中执行整个代码块?

时间:2020-03-05 18:48:36  来源:igfitidea点击:

在我的C程序中,我有一个表示正在运行的测试的线程,可以通过单击标记为"中断执行"的按钮来中止该线程。为了使线程(并因此进行测试)以一种优雅的方式终止(并预先做一些重要的工作),仅在定义良好的时刻启用此按钮,在这种情况下,我捕捉到" ThreadAbortedException",然后执行" Thread"。 ResetAbort()`死得很漂亮(也就是线程)。

问题在于,在可能发生中止的时间窗口中,有些任务一旦启动就需要从头到尾完成,因此,我担心TAE。锁没有为此提供解决方案,尽管最终块提供了解决方案,但我发现以下列方式包装重要代码并不优雅:

try {
} finally {
  // vital code
}

但是,我没有找到其他解决方案。

这是将ThreadAbortException的干扰延迟到块末尾的另一种方法吗?

解决方案

回答

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

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

使用这种模式,我们可以完全控制线程何时对异常终止进行操作,而不必担心关键操作会被中断。

回答

使用Thread.BeginCriticalRegion()

Notifies a host that execution is about to enter a region of code in which the effects of a thread abort or unhandled exception might jeopardize other tasks in the application domain.
Thread.BeginCriticalRegion()

//do important stuff here

Thread.EndCriticalRegion()