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

时间:2016-01-20 19:38:27

标签: c# .net multithreading dll native

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

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

我在项目设置中启用了本机代码调试,因此我可以看到所有正在运行的线程。当用户关闭应用程序窗口时,主线程似乎终止。我知道这一点,因为如果我在Visual Studio的Threads窗口中执行 Break All ,主线程将被重新分类为工作线程,并且没有可用的调用堆栈。还有20个其他线程仍处于活动状态,所有线程都有调用堆栈。我已经查看了所有这些线程的调用堆栈,没有任何内容可以解决(在任何调用堆栈中都没有提到dll)。

我可以采取哪些措施来缩小此问题的原因?我是否应该使用其他工具来帮助确定问题所在?

1 个答案:

答案 0 :(得分:1)

这意味着你的一些Foreground Threads还活着。与后台线程不同,前台线程使进程保持活动状态。

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

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

正如你所说

  

如果从未加载dll,则应用程序将在没有加载的情况下终止   问题

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

您必须找到一种方法来通知所有线程在该库中退出。看看你是否有任何api暴露。

如果你找不到任何东西,你就会得到一把"大锤"做法。即用Environment.Exit终止进程,这几乎总是有效。请确保使用此方法作为最后的手段,因为这可能会破坏进程状态。