【问题标题】:Can a .NET managed thread 'vanish' without killing the process?.NET 托管线程能否在不终止进程的情况下“消失”?
【发布时间】:2012-01-12 21:47:00
【问题描述】:

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

我们有一个包装 System.Threading.Thread 的对象,并在底层线程完成回调后立即设置一个“停止”标志。

所讨论的 System.Threading 线程是一个 MTA 线程,并且将 Background 属性设置为 true。我们没有在“遗留”未处理线程异常模式下运行。后台线程上未处理的异常可以并且确实会杀死程序。

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

可能相关的线程确实执行了一点点 COM 互操作。它检查 COM 公开的布尔属性。

不管怎样 - 我原以为如果后台线程抛出异常,托管进程会崩溃,并报告未处理的异常。

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

本文指出了 .NET 会终止线程但允许程序继续运行的三种情况:http://msdn.microsoft.com/en-us/library/ms228965.aspx

  • 线程中抛出 ThreadAbortException,因为调用了 Abort。

  • 由于正在卸载正在执行线程的应用程序域,因此在线程中引发了 AppDomainUnloadedException。

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

我确定前两点不适用于这里。我想知道第三点是否有任何相关的内容?我在网上搜索过,但找不到任何其他线索来说明所引用的“内部异常”可能是什么。

【问题讨论】:

    标签: .net multithreading com


    【解决方案1】:

    内部异常只是意味着在线程代码中抛出了异常。这将结束线程。

    【讨论】:

    • 感谢您对“内部异常”的解释,但能否请您限定一下:未处理的异常?我的经验是,无论 Background 属性是否为真,未处理的异常都会导致进程中断。
    • @sger6218 是正确的; Background 只是表示线程无法阻止进程关闭。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多