2009-01-13 142 views
0

我试图收集.NET进程或线程终止原因的完整列表,即使main()方法由try ... catch子句守护。什么会导致.NET进程/线程意外终止?

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

回答

0

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

编辑: 在读/写共用字段

0

网络连接超时的一些并发访问。

停电。

用户正在查询有问题的进程。

4

StackOverflowException不能由您的代码处理。

当您有一个无限循环时,通常会出现StackOverflowException异常,这会导致您的调用堆栈增长到超过通常的堆栈大小(1MB)。

还有更多的例外,你不能从中恢复。 ExecutionEngineException似乎是其中之一。

+0

我最近不得不解决一个国有企业造成其消耗的IIS的256K堆栈限制〜248K第三方的DLL,就像当它不是无限循环 – annakata 2009-01-13 09:21:25

1

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

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

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