主线程终止后进程继续 运行?

Process continues running after main thread has terminated?

首先我要说我在解决多线程问题方面没有太多经验。所以我读到的很多关于调试竞争条件、死锁、活锁等的内容对我来说都是纯理论的。

我有这个 .NET 应用程序正在使用动态加载的本机 win32 dll。如果从未加载 dll,应用程序将毫无问题地终止。但是,如果加载了 dll,那么当用户退出应用程序时,UI 会消失,但进程永远不会终止。

我在项目设置中打开了本机代码调试,所以我可以看到所有 运行 的线程。当用户关闭应用程序时 window 主线程似乎终止了。我知道这一点是因为如果我在 Visual Studio 中的线程 windows 中执行 Break All,主线程将被重新归类为工作线程并且没有调用堆栈可用。还有 20 个其他线程仍然处于活动状态,所有线程都有调用堆栈。我查看了所有这些线程的调用堆栈,但没有发现任何问题(在任何调用堆栈中都没有提到 dll)。

我可以采取哪些步骤来缩小导致此问题的原因?我应该使用任何其他工具来帮助查明问题吗?

这意味着您的一些前台线程仍然存在。与后台线程不同,前台线程使进程保持活动状态。

您应该使用后台线程或停止前台线程才能正常退出进程。

Windows 应用程序将在其所有线程停止时自动退出。

如你所说

If the dll is never loaded the application terminates without a problem

我假设所有 运行 线程都是非托管线程(不是由 clr 创建的)。本机代码中没有后台线程的概念。必须终止所有线程才能终止进程。

您必须找到一种方法来通知所有线程退出该库。看看你有没有为此公开 api。

如果您没有找到任何东西,那么您有一个 "Sledge Hammer" 方法。即用 Environment.Exit 终止进程几乎总是有效。请务必将此方法用作最后的手段,因为这会破坏进程状态。