【问题标题】:C# OpenFileDialog spawns many threads, and application exit hangingC# OpenFileDialog 产生许多线程,并且应用程序退出挂起
【发布时间】: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 秒才能终止。可悲的是我没有看到任何解决方案......

标签: c# .net


【解决方案1】:

我在网上搜索了这个并没有找到任何东西,但我通过调用 Dispose 解决了问题。代码如下:

private void startAllSequenceToolStripMenuItem_Click(object sender, EventArgs e)
{
    OpenFileDialog ofn = new OpenFileDialog();

    DialogResult result = ofn.ShowDialog();
    if (result == DialogResult.Ok)
    {
        MessageBox.Show("do stuff");
    }

    // This one line seems to allow my application to exit cleanly in debug and release.
    // But I don't instantiate a new object.
    // I used the control on the form and called Dispose from form_closing.
    ofn.Dispose();
}

【讨论】:

  • 有用的答案,为我解决了问题。将对话框包装在 using 块中而不是直接调用 Dispose 会更好。
  • 是的,这是更正确的答案@rho21,但当时这对我来说很快。
【解决方案2】:

这个线程OpenFileDialog/c# slow on any file. better solution? 有一些不错的答案。总而言之,作为最后手段检查来自 sysinternals 的 ProcExp。另外,它只是在调试器中很慢吗?如果是这样,我不会担心它,因为它不会影响您的用户。只需确保与您的其他代码隔离,这样您的团队就不会在调试器中不断绊倒它,因为它很慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多