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

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

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

【问题讨论】:

    标签: .net multithreading process terminate abort


    【解决方案1】:

    您的代码无法处理 StackOverflowException。

    当您有一个无限循环时,通常会发生 StackOverflowException,这会让您的调用堆栈增长,直到超出通常的堆栈大小 (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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多