Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ThreadAbortException的广泛使用_C#_.net_Multithreading - Fatal编程技术网

C# ThreadAbortException的广泛使用

C# ThreadAbortException的广泛使用,c#,.net,multithreading,C#,.net,Multithreading,我在一个遗留项目中工作,该项目在许多方法中都有此异常处理代码 catch(ThreadAbortException e) { ... } 我在项目的Thread.Abort()或Thread.Interrupt()调用中看不到任何地方。删除所有这些ThreadAbortException处理安全吗?或者,这是可以引发的其他方式。官方文档:“调用Abort方法时引发的异常。”如果您完全确定没有调用Thread.Abort,那么您不妨删除这些catch块 编辑:请注意,您的代码可能正在调用Th

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

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

官方文档:“调用Abort方法时引发的异常。”如果您完全确定没有调用Thread.Abort,那么您不妨删除这些catch块

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

无论如何,这并不重要,因为ThreadAbortException实际上无法处理,因为CLR本身将重新触发它以尽快实际终止线程

“实际上是的,ThreadAbortException是特殊的。即使您处理了它,CLR也会在try/catch/finally结束时自动重新抛出它。(如注释中所述,可以使用ResetAbort抑制它,但此时代码闻起来像腐烂的鱼。) -阅读此问题了解更多详细信息:

官方文档:“调用Abort方法时引发的异常。”如果完全确定没有对Thread.Abort的调用,则不妨删除这些catch块

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

无论如何,这并不重要,因为ThreadAbortException实际上无法处理,因为CLR本身将重新触发它以尽快实际终止线程

“实际上是的,ThreadAbortException是特殊的。即使您处理了它,CLR也会在try/catch/finally结束时自动重新抛出它。(如注释中所述,可以使用ResetAbort抑制它,但此时代码闻起来像腐烂的鱼。)
-阅读此问题了解更多详细信息:

如果专门回答您的问题,我会说,最好不要删除这些异常处理程序,因为它们很可能是由试图解决问题的开发人员添加的。我认为添加这些处理程序是有原因的,因此如果您删除这些代码,将来可能会再次出现一些bug

关于
threadaboradexception
:我确信它不仅可以在调试时通过调用
Thread.Abort()
方法抛出(这可能是VS中的一个错误,我不确定),还可以强制程序安静地崩溃。因此,根据这些处理程序的内部结构,开发人员可能试图解决此类问题


还请记住,您也可以在单独的线程中调用第三方库、web服务等的方法。我不确定他们是否能抛出这样一个异常,但这是一个可能的情况。

< P>如果回答你的问题,我会说删除这些异常处理程序会更好。我认为添加这些处理程序是有原因的,因此如果您删除这些代码,将来可能会再次出现一些bug

关于
threadaboradexception
:我确信它不仅可以在调试时通过调用
Thread.Abort()
方法抛出(这可能是VS中的一个错误,我不确定),还可以强制程序安静地崩溃。因此,根据这些处理程序的内部结构,开发人员可能试图解决此类问题


还请记住,您也可以在单独的线程中调用第三方库、web服务等的方法。我不确定他们是否能抛出这样一个异常,但这是一个可能的情况。

是在主线程上运行的项目和后台工作者线程的旋转吗?如果主线程在后台线程运行时退出,则后台线程上可能会发生ThreadAbortedException


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

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


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

@downvoter Care要解释为什么您对这个答案投了反对票吗?不是我的反对票,而是:您是说根据文档,抛出
ThreadAbortException
的唯一方法是调用
Thread.Abort
时。首先,这是错误的:没有什么可以阻止您使用
ThreadAbortException
语句手动抛出
ThreadAbortException
(即使不能直接实例化,也可以捕获并保存)。其次,这是误导性的:虽然OP的代码可能不包含对
线程.Abort
的任何直接调用,但OP可能使用了调用
线程.Abort
的外部代码,一个值得注意的例子是Microsoft的IIS web服务器。当然,您可以手动抛出它,但这样做并不意味着有什么特别,因为它是一个抛出的异常IIRC,与调用线程不同。中止将导致CLR根据需要抛出尽可能多的TAE实例以尽快杀死线程。你的IIS评论很有道理。你是对的,手动抛出TAE并不特别。不过,他们仍然会击中OP的
catch
块。但我必须承认,我不认为这一事件发生的概率很高。“下注者关心的是解释为什么你们否决了这个答案?不是我的否决,而是基于文件的说法。