进程在关闭窗体时未被终止

5
我刚刚使用Windows Forms构建了我的测试应用程序的第一个版本。我注意到在运行该应用程序时,它完全正常,没有任何问题,就像调试视图一样。但是当关闭应用程序时,我发现实际的可执行文件/进程名称会在任务管理器中挂起,并且无法正确关闭。
经过进一步检查,我发现在不隐藏前一个窗体的情况下调用另一个窗体时,会生成一个新进程(有点意料之中)。当关闭包含几个文本框、标签和一个DataGridView的新窗体时,新生成的进程不会自行关闭,而是仍然存在。然后关闭主窗口,窗口从任务栏/视图中消失,但进程仍然活跃,使用8,268k - 8,308k内存。
    private void ClientSearch_Click(object sender, EventArgs e)
    {
        ClientSearch Clientsearch = new ClientSearch();
        Clientsearch.Show();
    }

enter image description here


1
你是否正在使用线程?它们的IsBackground属性设置为true了吗?你是将配置保存到文件中还是在OnFormClose事件中进行任何工作? - firda
@AndrewGrinder 请查看我的更新。我添加了代码,其中显示了生成新进程的表单。 - Daryl Gill
@DarylGill 当您启动应用程序时,它会创建多个进程吗?还是在单击“客户端搜索”后创建多个进程? - Andrew Grinder
是的,这很奇怪。所以我通常会将我的主窗体(托管导航)隐藏并显示登录窗体。如果登录窗体上的凭据正确,则重新显示主窗体。你有检查过像@firda提出的任何线程吗? - Andrew Grinder
1
你如何创建进程?创建新表单并不会创建新进程,这些表单共享消息循环(一个进程,一个主线程抽取消息)。你确定所有的表单都已关闭而不仅仅是隐藏了吗? - firda
显示剩余2条评论
2个回答

8

这种行为的标准解释:

  • 在显示另一个窗口并忘记取消隐藏主窗口时,隐藏主窗口。现在没有可见的窗口了,用户也不能做任何事情来取消隐藏,但是您的应用程序仍在运行。

  • 启动线程并未确保在关闭主窗口时终止线程。将线程的IsBackground属性设置为true可以解决该问题。

  • 在您的代码中调用Application.DoEvents()。这是一种非常危险的方法,允许您关闭用户界面,但不会停止调用它的循环,因此您的应用程序的主线程也不会退出。

当您调试应用程序时,这种问题也很容易看到。您可能已经习惯使用工具栏上的红色矩形(也称为调试+停止调试)强制调试器退出。调试+ Windows + 线程调试器窗口可以提供有关最后两个项目原因的见解。或者,您可以使用“工具”+“附加到进程”将调试器附加到僵尸进程。


5

呼叫

Application.Exit();

在表单关闭时。

您的应用程序每次运行应仅创建一个进程。新表单不应创建新进程。


哦,我可能出了什么问题,因为你说应用程序应该创建多个进程。所以我在某个地方做错了。 - Daryl Gill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接