我正在 Visual Studio 中制作一个简单的 Windows 窗体应用程序。但是当我想关闭应用程序时遇到问题。当我从任务栏右键单击它并关闭它时,我可以看到后台进程仍在任务管理器中运行。
如何杀死整个应用程序?
我已经以应用程序启动时打开的第一种形式调整了它:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
if(!exit)
{
if (MessageBox.Show("Close the app?", "Simple App", MessageBoxButtons.YesNo) == DialogResult.Yes)
{
exit = true;
Close();
}
else
{
e.Cancel = true;
exit = false;
}
}
}
我在
Application.Exit();
事件中的所有表单上添加了 OnFormClosing
。而且效果很好。
您所描述的是后台进程的主要问题。他们只是不会在调用进程结束时自动结束工作。
本质上,你有两种可能的替代方案,尽管两者都有延迟(并且有可能无法工作,具体取决于你的后台进程的稳定性)。
手动终止进程 创建进程时,您保存其处理程序,然后在应用程序退出时向其发送终止信号。像往常一样,当您手动发送终止信号时,可能需要一段时间才能生效。如果 if 生效,仍然可能会发生进程忽略它或以您不希望它结束的进程执行状态结束
进程内有一个终止标志 该过程本身有一个他可以做出反应的标志。当您终止主应用程序时,您将标志设置为“结束我”设置,并在后台进程中检查每次迭代(或至少定期)是否设置了标志,如果设置了则结束进程内。
在这两种情况下,您都可以选择在主应用程序中使用 while 循环等待,并检查进程是否已正确结束。这里唯一的问题是,它可能取决于后台进程的确切实现,它永远不会结束,因为它只是忽略了kill命令。
因此,从本质上讲,可以从主进程中杀死后台进程,但这可能是延迟杀死,并且可能不起作用。
在这种情况下,当您希望后台进程在应用程序退出时结束时,我会问自己另一个问题:您确定要存在后台进程吗?因为前台进程会自动执行您想要的操作:在主进程执行结束时结束。
您可以在退出事件或退出方法中使用其中之一代码
System.Windows.Forms.Application.Exit();
System.Environment.Exit(0);
System.Windows.Forms.Application.ExitThread();