4

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

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

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

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

openFileDialog.ShowDialog() 之前的线程: openFileDialog.ShowDialog() 之前的线程

对话框打开时的线程: 对话框打开时的线程

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

2 回答 2

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();
}
于 2016-01-14T12:34:07.293 回答
1

这个线程OpenFileDialog/c# 在任何文件上都很慢。更好的解决方案?有一些半体面的答案。总而言之,作为最后手段检查来自 sysinternals 的 ProcExp。另外,它只是在调试器中很慢吗?如果是这样,我不会担心它,因为它不会影响您的用户。只需确保与您的其他代码隔离,这样您的团队就不会在调试器中不断绊倒它,因为它很慢。

于 2014-02-17T04:49:18.920 回答