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

3
在我的C#程序中,我有一个线程代表正在运行的测试,可以通过点击标有“中断执行”的按钮来中止。为了使线程(因此也包括测试)以一种优雅的方式终止(并在此之前执行一些重要的工作),只有在某些明确定义的时刻才启用该按钮,在这些时刻我捕获ThreadAbortedException,执行Thread.ResetAbort()并优美地死亡(即线程结束)。
问题在于,在可能中止的时间窗口中,有一些任务需要从开始到完成一次性完成,因此我担心ThreadAbortedException。锁定不能解决这个问题,虽然finally块可以,但我不认为将重要代码包装在以下方式中是优雅的:
try {
} finally {
  // vital code
}

然而,我没有找到其他的解决方案。

这是另一种延迟 ThreadAbortException 干扰直到块结束的方法吗?

2个回答

5
在哪些情况下会产生ThreadAbortException异常是比较复杂的。更好的选择可能是问一下为什么要使用ThreadAbortExceptions。
更好的模式是使用一个标志来指示正在运行的线程应该中止,然后在工作过程中定期测试该标志。如果被设置,那么可以在那时抛出异常。
使用这种模式,您完全控制着线程何时执行中止操作,并且不必担心关键操作被中断。

3

使用Thread.BeginCriticalRegion()

通知宿主,执行即将进入代码区域,在该区域中线程中止或未处理的异常可能会危及应用程序域中的其他任务。

Thread.BeginCriticalRegion()

//do important stuff here

Thread.EndCriticalRegion()

尽管BeginCriticalRegion()在某种程度上可以确保代码执行,因为否则您的应用程序可能会停止,但我想要一个设备,它禁止ThreadAbortExceptions打断我的代码。 - André Chalella

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接