当.NET进程主线程完成时,其他当前正在执行的线程会发生什么情况?

当.NET进程主线程完成时,其他当前正在执行的线程会发生什么情况?,.net,multithreading,.net,Multithreading,当.NET进程主线程完成时,其他当前正在执行的线程会发生什么情况?如果它们分配了非托管资源,而这些资源必须在停止之前释放,该怎么办?如果其他线程已设置为true,它们将立即退出。否则,应用程序将继续运行(如果是WinForms或WPF应用程序,则不可见) 如果其他线程具有非托管资源,则当进程退出时,操作系统通常会关闭/释放这些资源(文件句柄等。可能有我不熟悉的例外情况)。当检测到应用程序正在退出时,最好还是手动释放这些资源。“当检测到应用程序正在退出时,最好还是手动释放这些资源。”为什么?如果操

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

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


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

“当检测到应用程序正在退出时,最好还是手动释放这些资源。”为什么?如果操作系统无论如何都要这么做,为什么要重复这项工作,除非绝对必要(而且常常无法有效/正确地完成)。@MartinJames因为当进程退出时,这些非托管资源将被操作系统以极大的偏见清理掉。在写入中间的文件可能处于不一致的状态,网络流可以在不通知对方的情况下关闭,等等。您通常希望知道进程何时结束,并尝试以有意义的方式保存终端状态。@ChrisShain-文件和网络连接已关闭-如果我怀着极大的偏见关闭服务器,我的所有客户端都会立即显示TCP断开连接。我将perisitent状态保存在主线程中,并在退出之前将其保存在主线程中,至于其他线程的任何数据-很难:)糟糕的选择是混乱、笨拙、难以测试的线程信号代码,这些代码可能在所有操作系统、所有核心配置和所有阻塞调用上都能工作,也可能无法工作。我的大多数应用程序在所有操作系统和所有核心配置上都会立即关闭,因为所有线程都是由操作系统单独终止的。