我首先要说的是,我在解决多线程问题方面没有太多经验。所以我读到的关于调试竞争条件,死锁,活锁等的很多内容对我来说都是理论上的。
我有这个.NET应用程序正在使用动态加载的本机win32 dll。如果从未加载dll,则应用程序将终止而不会出现问题。但是,如果加载了dll,那么当用户退出应用程序时,UI将消失,但该过程永远不会终止。
我在项目设置中启用了本机代码调试,因此我可以看到所有正在运行的线程。当用户关闭应用程序窗口时,主线程似乎终止。我知道这一点,因为如果我在Visual Studio的Threads窗口中执行 Break All ,主线程将被重新分类为工作线程,并且没有可用的调用堆栈。还有20个其他线程仍处于活动状态,所有线程都有调用堆栈。我已经查看了所有这些线程的调用堆栈,没有任何内容可以解决(在任何调用堆栈中都没有提到dll)。
我可以采取哪些措施来缩小此问题的原因?我是否应该使用其他工具来帮助确定问题所在?
答案 0 :(得分:1)
这意味着你的一些Foreground Threads还活着。与后台线程不同,前台线程使进程保持活动状态。
您应该使用后台线程或停止前景线程才能正常退出流程。
Windows应用程序将在其所有线程停止时自动退出。
正如你所说
如果从未加载dll,则应用程序将在没有加载的情况下终止 问题
我假设所有正在运行的线程都是非托管线程(不是由clr创建的)。本机代码中没有后台线程的概念。必须终止所有线程才能终止进程。
您必须找到一种方法来通知所有线程在该库中退出。看看你是否有任何api暴露。
如果你找不到任何东西,你就会得到一把"大锤"做法。即用Environment.Exit
终止进程,这几乎总是有效。请确保使用此方法作为最后的手段,因为这可能会破坏进程状态。