C# 进程不会在窗体关闭时终止

C# 进程不会在窗体关闭时终止,c#,winforms,C#,Winforms,我刚刚使用Windows窗体构建了测试应用程序的版本1。我注意到,在运行应用程序时,它运行完全正常,没有任何故障,与调试视图完全相同。在关闭应用程序时,我注意到实际的可执行文件/进程名挂在TaskManager中,无法正确关闭 经过进一步检查,我注意到当调用另一个表单而不隐藏前一个表单时,会产生一个新的进程(有点像预期的)。当关闭新表单(包含一些文本框、标签和一个DataGridView)时,新生成的进程不会杀死它自己,而是保持不变。然后关闭主窗口,该窗口将从任务栏/视图中消失,但进程仍然使用8

我刚刚使用Windows窗体构建了测试应用程序的版本1。我注意到,在运行应用程序时,它运行完全正常,没有任何故障,与调试视图完全相同。在关闭应用程序时,我注意到实际的可执行文件/进程名挂在TaskManager中,无法正确关闭

经过进一步检查,我注意到当调用另一个表单而不隐藏前一个表单时,会产生一个新的进程(有点像预期的)。当关闭新表单(包含一些文本框、标签和一个
DataGridView
)时,新生成的进程不会杀死它自己,而是保持不变。然后关闭主窗口,该窗口将从任务栏/视图中消失,但进程仍然使用8268K-8308K内存保持活动状态

    private void ClientSearch_Click(object sender, EventArgs e)
    {
        ClientSearch Clientsearch = new ClientSearch();
        Clientsearch.Show();
    }

打电话

在表单关闭/关闭时


应用程序每次运行只能创建一个进程。新表单不应创建新流程。

此行为的标准解释:

  • 在显示另一个窗口时隐藏主窗口,而忘记取消隐藏它。现在已经没有可见的窗口,用户也不能做任何事情来取消隐藏它,但你的应用程序当然会继续运行

  • 启动线程,但不确保在主窗口关闭时终止线程。将线程的IsBackground属性设置为true是一种解决方法

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


当你调试你的应用程序时,这种问题也很容易被发现。您可能已经习惯于使用工具栏上的红色矩形(也称为Debug+停止调试)强制调试器退出。Debug+Windows+Threads调试器窗口可以深入了解最后两个项目符号的原因。或者,您可以使用Tools+Attach to Process将调试器附加到僵尸进程。

是否使用线程?他们是否将IsBackground设置为true?您是否将配置保存到文件或在OnFormClose中执行任何工作?是否可以在调用
form.Show()
?@AndrewGrinder的位置发布come代码?请查看我的更新。添加了代码,我正在显示生成新process@DarylGill那么,当你启动应用程序时,它会创建多个进程?还是在单击“客户端搜索”后创建多个流程?如何创建流程?创建新表单并不创建新进程,表单共享消息循环(一个进程,一个主线程泵送消息)。你确定所有的表单都是关闭的,而不仅仅是隐藏的吗?嗯,有什么想法我可能弄糟了,就像你说的,应用程序应该创建多个进程。所以我在路上的某个地方做错了什么
Application.Exit();