.NET托管线程可以“消失”而不会破坏进程吗?

时间:2011-12-05 02:42:21

标签: .net multithreading com

我最近遇到过一种情况,即作为Microsoft Outlook Addin(可能相关的?)的一部分运行的.NET线程似乎已“消失”。

我们有一个包装System.Threading.Thread的对象,并在底层线程完成运行其回调后立即设置一个'stopped'标志。

有问题的System.Threading线程是一个MTA线程,并将Background属性设置为true。我们没有在'遗留'未处理的线程异常模式下运行。后台线程上的未处理异常可以并且确实会终止该程序。

有问题的线程操作任务队列。在Outlook运行的某个时刻,我注意到任务队列没有处理。我附加了一个调试器,发现线程不再存在。 'stopped'标志尚未设置,表明线程回调没有完成执行。包装器对象不会捕获任何异常。

有问题的线程可能会执行一点点COM互操作。它检查COM公开的布尔属性。

无论如何 - 我原本以为如果后台线程抛出异常,托管进程就会崩溃,报告未处理的异常。

是否有任何人知道的情况会导致线程死亡或以其他方式消失而不会导致进程失效?

本文指出.NET有三种情况可以杀死该线程但允许程序继续:http://msdn.microsoft.com/en-us/library/ms228965.aspx

  • 由于Abort被调用,因此在线程中抛出ThreadAbortException。

  • 在线程中抛出AppDomainUnloadedException,因为正在卸载正在执行该线程的应用程序域。

  • 公共语言运行库或主机进程通过抛出内部异常来终止线程。

我确信前两点不适用于此。我想知道第三点是否有任何可能相关的内容?我在网上搜索过,但找不到任何其他线索,可能会引用“内部异常”。

1 个答案:

答案 0 :(得分:2)

内部异常只是意味着线程代码中抛出异常。那将结束这个主题。