有没有办法至少推迟托管应用程序的终止(几十毫秒)并设置一些共享标志以让其他线程有机会优雅地终止(SO线程本身显然不会进一步执行任何事情)?我正在考虑为此使用 JIT 调试器或 CLR 托管 - 如果有人之前尝试过,我很好奇。
为什么我想做这么错的事?:
没有太多细节——想象一下这个类比——你在赌场赌轮盘赌,突然发现轮盘赌是不可靠的假货。因此,您想立即离开赌场,但可能想先从赌桌上取回您的赌注。不幸的是,我不能为此利用单独的流程,因为有非常严格的性能要求。
试过但没有用:
StackOverflowException 的 .NET 行为(以及 MSDN 上的矛盾信息)已经在 SO 上讨论过多次 - 快速总结一下:
HandleProcessCorruptedStateExceptionsAttribute(例如在 appdomain 未处理的异常处理程序上)不起作用
ExecuteCodeWithGuaranteedCleanup不起作用
legacyUnhandledExceptionPolicy不起作用
可能很少有其他尝试如何处理 StackOverflowExceptions - 但似乎很明显,CLR 终止了整个过程,正如Hans Passant在这个很好的答案中提到的那样。
考虑尝试:
- JIT 调试器 - 冻结异常线程,设置一些共享标志(可能在固定位置)并在短时间内解冻其他线程。
- CLR 托管和设置未处理的异常策略
你还有别的想法吗?或者这两种方式的任何经验(成功/不成功)?