【发布时间】:2009-01-13 09:01:44
【问题描述】:
我正在尝试收集 .NET 进程或线程终止原因的完整列表,即使 main() 方法由 try...catch 子句保护。
其中一个原因是 Thread.Abort()(除非您调用 Thread.ResetAbort)。你知道更多的原因吗?
【问题讨论】:
标签: .net multithreading process terminate abort
我正在尝试收集 .NET 进程或线程终止原因的完整列表,即使 main() 方法由 try...catch 子句保护。
其中一个原因是 Thread.Abort()(除非您调用 Thread.ResetAbort)。你知道更多的原因吗?
【问题讨论】:
标签: .net multithreading process terminate abort
您的代码无法处理 StackOverflowException。
当您有一个无限循环时,通常会发生 StackOverflowException,这会让您的调用堆栈增长,直到超出通常的堆栈大小 (1MB)。
还有更多无法恢复的例外情况。 ExecutionEngineException 似乎就是其中之一。
【讨论】:
与 C/C++ 不同,main() 并不是应用程序的全部。因此,即使 main() 中的所有代码都用 try/catch 块包围,也不会捕获该代码生成的所有异常。
但是,您可以通过监听 Application.ThreadException 事件附加一个函数来处理整个应用程序抛出的未处理异常,这将帮助您从应用程序中的任何线程捕获异常,无论它是否由您的代码创建.
例如,您的代码可能会调用外部非托管 DLL 中的代码。该代码可能会执行自己的线程,这可能会异步失败,从而引发异常。该异常属于您的应用程序的进程,但不属于您的任何代码。如果未被捕获,将导致您的程序意外终止。
【讨论】:
也许你的线程中发生了一个未处理的异常,最终杀死了线程;在你的主线程中有一个 try catch 子句不会从另一个正在运行的线程中捕获和异常。
编辑: 共享字段的读/写中的一些并发访问
【讨论】:
网络连接超时。
停电。
用户正在终止相关进程。
【讨论】:
卸载 AppDomain
【讨论】: