什么会导致 .NET 进程/线程意外终止?

Posted

技术标签:

【中文标题】什么会导致 .NET 进程/线程意外终止?【英文标题】:What can cause a .NET process/thread to terminate unexpectedly? 【发布时间】:2009-01-13 09:01:44 【问题描述】:

我正在尝试收集 .NET 进程或线程终止原因的完整列表,即使 main() 方法由 try...catch 子句保护。

其中一个原因是 Thread.Abort()(除非您调用 Thread.ResetAbort)。你知道更多的原因吗?

【问题讨论】:

【参考方案1】:

您的代码无法处理 ***Exception。

当您有一个无限循环时,通常会发生 ***Exception,这会让您的调用堆栈增长,直到超出通常的堆栈大小 (1MB)。

还有更多无法恢复的例外情况。 ExecutionEngineException 似乎就是其中之一。

【讨论】:

我最近不得不修复一个由第三方 DLL 引起的 SOE,它消耗了 IIS 的 256K 堆栈限制中的约 248K,就像它与无限循环无关时的示例 哦,是的,很高兴有一些例子表明无限循环不是原因。但我认为你使用的 dll 可能会进行一些递归调用,否则我无法想象堆栈限制怎么会这么容易被超出。顺便说一句,我在调试递归 XSL 模板时也体验过 SOE。递归是邪恶的! 通过值传递大对象作为方法参数也会很快用完可用堆栈。 这仅适用于主线程吗?或者 SOE 可以从工作线程中杀死整个进程吗?基本上,这只是在启动期间才成立吗? 另外,我指的是 WCF。有人根据我的问题编辑了意图。【参考方案2】:

与 C/C++ 不同,main() 并不是应用程序的全部。因此,即使 main() 中的所有代码都用 try/catch 块包围,也不会捕获该代码生成的所有异常。

但是,您可以通过监听 Application.ThreadException 事件附加一个函数来处理整个应用程序抛出的未处理异常,这将帮助您从应用程序中的任何线程捕获异常,无论它是否由您的代码创建.

例如,您的代码可能会调用外部非托管 DLL 中的代码。该代码可能会执行自己的线程,这可能会异步失败,从而引发异常。该异常属于您的应用程序的进程,但不属于您的任何代码。如果未被捕获,将导致您的程序意外终止。

【讨论】:

【参考方案3】:

也许你的线程中发生了一个未处理的异常,最终杀死了线程;在你的主线程中有一个 try catch 子句不会从另一个正在运行的线程中捕获和异常。

编辑: 共享字段的读/写中的一些并发访问

【讨论】:

【参考方案4】:

网络连接超时。

停电。

用户正在终止相关进程。

【讨论】:

【参考方案5】:

卸载 AppDomain

【讨论】:

以上是关于什么会导致 .NET 进程/线程意外终止?的主要内容,如果未能解决你的问题,请参考以下文章

mongodb启动服务时候报错。错误1067,进程意外终止。

常用线程控制原语

无法启动MYSQL服务”1067 进程意外终止”解决的方法——汇总及终极方法

服务无法启动:错误 1067:进程意外终止

IIS6 程序池错误< 'DefaultAppPool' 提供服务的进程意外终止>

从 ASP.NET 启动进程 - 为啥进程会立即终止?