广泛使用ThreadAbortException

时间:2016-06-18 15:31:08

标签: c# .net multithreading

我在一个遗留项目中工作,该项目在许多方法中都有这个异常处理代码。

catch(ThreadAbortException e)
{
  ...
}

我没有在项目Thread.Abort()或Thread.Interrupt()调用中看到任何地方。删除所有这些ThreadAbortException处理是否安全,或者是可以引发的其他方式。

3 个答案:

答案 0 :(得分:1)

官方文档:"调用Abort方法时抛出的异常。"如果你完全确定没有调用Thread.Abort,那么你也可以删除那些catch块。

编辑:请注意您的代码可能在外部应用程序的上下文中运行,该应用程序可能会在您的线程上调用Thread.Abort。

无论如何都不重要因为ThreadAbortException无法真正处理,因为CLR本身会重新抛出它以实际杀死线程。

"实际上是的,ThreadAbortException是特殊的。即使你处理它,它也会在try / catch / finally结束时被CLR自动重新抛出。 (正如评论中所指出的那样,它可以通过ResetAbort来抑制,但到那时代码就像腐烂的鱼一样。)" - 阅读此问题以获取更多详细信息:ThreadAbortException

答案 1 :(得分:1)

如果专门回答你的问题,我会说删除这些异常处理程序会更好,因为很可能是某些开发人员尝试解决问题而添加它们。我认为有理由添加这些处理程序,所以如果你只删除这些代码,它可能导致将来再次出现一些错误。

关于ThreadAbordException:我确信它不仅可以在调试时调用Thread.Abort()方法(它可能是VS中的错误,我不确定)并且它迫使您的程序无声地崩溃。因此,根据这些处理程序的内部情况,开发人员可能会尝试解决此类问题。

另外请记住,您也可以在单独的线程中调用第三方库,Web服务等方法。我不确定他们是否可以抛出这样的例外,但这是一个可以考虑的案例。

答案 2 :(得分:1)

项目是否在主线程上运行并启动后台工作线程?如果在后台线程运行时主线程退出,则后台线程上可能发生ThreadAbortedException。

catch语句可以专门处理这种情况,后台线程上实际上没有发生任何错误,其方式与任何其他异常不同。