C#OpenFileDialog产生许多线程,并且应用程序退出挂起

时间:2013-09-24 07:26:04

标签: c# .net

最近我的应用程序没有正常关闭时出现问题。 在告知退出后,当我查看任务管理器时,该进程仍在运行,我无法终止该进程

突然间,我意识到一种奇怪的模式。只有在应用程序运行时随时打开OpenFileDialog时才会出现关闭问题。我调试了一下,看到一些线程在应用程序退出后没有关闭。另外,令我惊讶的是,当我调用OpenFileDialog.ShowDialog()时,它产生了很多线程(见下图)。线程在应用程序的生命周期内都是活动的。

  • 为什么OpenFileDialog会产生这么多线程?为什么文件对话框关闭后它们没有关闭。

  • OpenFileDialog问题与我的关机问题有什么关系......?

在openFileDialog.ShowDialog()之前的线程: Threads just before openFileDialog.ShowDialog()

对话框打开时的线程: Threads while the dialog is open

在openFileDialog.ShowDialog()返回后立即执行线程: Threads right after openFileDialog.ShowDialog() has returned

应用程序关闭后挂起的线程: Threads hanging after the application has been shut down

打开对话框的代码:

    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");
    }

2 个答案:

答案 0 :(得分:3)

我在网上搜索此内容并发现什么,但我通过调用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();
}

答案 1 :(得分:1)

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