【问题标题】:When a .NET process Main Thread finishes, what happens with the other currently executing Threads?当 .NET 进程主线程完成时,其他当前正在执行的线程会发生什么情况?
【发布时间】:2012-08-01 22:12:07
【问题描述】:

当 .NET 进程的主线程完成时,其他当前正在执行的线程会发生什么情况?如果他们分配了必须在停止之前释放的非托管资源怎么办?

【问题讨论】:

    标签: .net multithreading


    【解决方案1】:

    如果其他线程将Thread.IsBackground 设置为true,它们将立即退出。否则应用程序将继续运行(如果它是 WinForms 或 WPF 应用程序,则不可见)。

    如果其他线程具有非托管资源,则通常会在进程退出时由操作系统关闭/释放(文件句柄等。此规则可能存在我不熟悉的例外情况)。当您检测到应用程序正在退出时,最好手动释放这些资源。

    【讨论】:

    • '当您检测到应用程序正在退出的事实时,仍然最好手动释放这些资源。'为什么?如果操作系统无论如何都要这样做,除非绝对必要,否则为什么要重复努力(并且通常无法有效/正确地这样做)。
    • @MartinJames 因为当进程退出时,那些非托管资源将被操作系统以extreme prejudice 清理。您正在编写的文件可能会处于不一致的状态,网络流可能会在未通知对方的情况下关闭等。您通常想知道进程何时结束并尝试以有意义的方式保存终端状态.
    • @ChrisShain - 文件和网络连接已关闭 - 如果我以极端偏见关闭服务器,我的所有客户端都会立即显示 TCP 断开连接。我在主线程中保持 perisitent 状态并在退出之前将其保存在那里,至于其他线程的任何数据 - 很难:) 悲惨的替代方案是凌乱、笨拙、难以测试的线程信号代码,它可能工作,也可能不工作在所有操作系统、所有核心配置和所有阻塞调用上。我的大多数应用程序每次都会在所有操作系统和所有核心配置上立即关闭,因为所有线程都由操作系统单独终止。
    猜你喜欢
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-31
    • 2019-02-11
    • 2017-11-18
    • 1970-01-01
    • 2015-01-29
    相关资源
    最近更新 更多