【发布时间】:2012-02-23 15:31:55
【问题描述】:
根据 MSDN,AppDomain.Unload 会导致卸载 AppDomain 内的所有线程抛出线程中止异常。
域中的线程使用 Abort 方法终止,该方法 在线程中引发 ThreadAbortException。虽然线程 应立即终止,它可以继续执行一个 finally 子句中不可预测的时间量。 -- 来自MSDN
所以我的理解是,每当我在任何地方编写预期在此 AppDomain 中运行的代码时,我都必须预料到任何线程都可能随时发生线程中止。这是真的? 是否所有代码都应该假设可以随时抛出 ThreadAbortException?
实际上这实际上消除了 catch(Exception ex),因为它会捕获 ThreadAbortException 并尝试处理它,通常是通过记录一个确实不应该记录的错误(因为卸载 AppDomain 是' t真的是一个例外)。
为了避免不必要的异常处理/错误记录,是否还有其他需要注意的事项?
【问题讨论】:
-
我已经经历了 很多 明确“不缓存”ThreadAbort(甚至 OutOfMemory..)的代码。如果将“系统关键”异常与其他异常分开应该会很好,但没有:}
-
谢天谢地,至少 ThreadAbort 需要显式重置才能不重新抛出(因此“捕获”它主要是错误记录/无效恢复/错误假设程序保持在有效状态的问题) ; OOM 有时会被扼杀,直到 .NET 进程“致命”崩溃:}
标签: c# .net appdomain threadabortexception