【发布时间】:2013-09-24 07:26:04
【问题描述】:
最近我的应用程序无法正常关闭时遇到问题。 在被告知退出后,我在任务管理器中查看该进程仍在运行,我无法终止该进程。
突然间,我意识到一个奇怪的模式。仅当我在应用程序运行时打开 OpenFileDialog 时才会出现关机问题。我调试了一下,发现一些线程在应用程序应该退出后没有关闭。另外,令我惊讶的是,当我调用 OpenFileDialog.ShowDialog() 时,它产生了很多线程(见下图)。线程在应用程序的整个生命周期中都处于活动状态。
为什么 OpenFileDialog 会产生这么多线程?以及为什么关闭文件对话框后它们没有关闭。
OpenFileDialog 问题与我的关机问题有何关系...?
openFileDialog.ShowDialog() 之前的线程:
对话框打开时的线程数:
openFileDialog.ShowDialog() 返回后的线程:
应用程序关闭后挂起的线程:
打开对话框的代码:
private void startAllSequenceToolStripMenuItem_Click(object sender, EventArgs e)
{
OpenFileDialog ofn = new OpenFileDialog();
DialogResult result = ofn.ShowDialog();
if (result == DialogResult.Cancel)
return;
MessageBox.Show("do stuff");
}
【问题讨论】:
-
也许您可以共享调用 OpenFileDialog 的那部分代码?
-
禁用所有外壳扩展。在没有 shell 扩展的机器上试用你的程序。
-
我已将调用 OpenFileDialog 的代码添加到帖子中。
-
显示循环调用 OpenFileDialog 或调用它的函数的代码部分。
-
我遇到了同样的问题,找了很久的答案。 Shell 扩展可能是问题所在:我在没有安装任何东西的 XP 虚拟机上测试了我的应用程序 - 生成了 3 个线程,应用程序在一秒钟内终止。在我的开发机器上安装了几个扩展(例如 tortoise svn、hardlink shellext、7-zip 等),还有 20 个线程,需要 15 秒才能终止。可悲的是我没有看到任何解决方案......