WinForms程序关闭后仍驻留进程,红叉未触发FormClosed事件求助
问题分析与解决
环境
- Visual Studio 2022
- .NET 7
- C# WinForms项目模板
问题描述
使用Start Without Debug启动程序,点击窗口右上角红叉时未触发FormClosed事件,想了解红叉触发的是哪个事件,以及为何程序关闭后仍在进程中存活。
相关代码
Program类代码
namespace JKEventsPractice1123 { internal static class Program { static Button _button1 = new Button(); /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { ApplicationConfiguration.Initialize(); _button1 = new Button(); _button1.Click += Button1_Clicked; var form = new Form(); form.Controls.Add(_button1); form.Show(); Application.Run(); } static void Button1_Clicked(object sender, EventArgs e) { MessageBox.Show("You clicked the button"); _button1.Click -= Button1_Clicked; } } }
Form1后台代码
private void Form1_FormClosed(object sender, FormClosedEventArgs e) { Application.Exit(); }
问题原因与解答
1. 为何FormClosed事件未触发?
你在Program.Main里实例化的是通用Form类,而非项目中的Form1类。Form1里的FormClosed事件处理方法只绑定在Form1的实例上,和你实际显示的那个Form实例完全无关,自然不会被触发。
2. 点击红叉触发的是什么事件?
点击窗口红叉时,会依次触发当前Form实例的FormClosing和FormClosed事件——只是你没有给这个动态创建的Form绑定任何事件处理方法,所以看不到效果。
3. 程序关闭后进程仍存活的原因?
你调用的是无参数的Application.Run()重载,这个方法启动的消息循环会一直运行,直到显式调用Application.Exit()或Application.ExitThread()才会终止。点击窗口红叉只是关闭了当前窗口,并没有终止消息循环,所以进程会继续在后台运行。
修复方案
可以任选以下一种方式解决:
方案一:使用带参数的
Application.Run
将Application.Run()改为Application.Run(form),这样当主窗口关闭时,消息循环会自动终止,进程随之退出:var form = new Form(); form.Controls.Add(_button1); Application.Run(form); // 传入form实例方案二:给动态创建的Form绑定FormClosed事件
在显示窗口前,给form绑定FormClosed事件,在事件中终止消息循环:var form = new Form(); form.Controls.Add(_button1); form.FormClosed += (s, e) => Application.Exit(); // 绑定事件 form.Show(); Application.Run();方案三:直接实例化Form1
如果你想使用Form1中已写好的事件处理,直接创建Form1的实例即可:var form = new Form1(); form.Controls.Add(_button1); form.Show(); Application.Run(form);
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

