C#--winform--程序退出总结
学习笔记:
参照:https://blog.csdn.net/weixin_43267344/article/details/102841240
1,this.Close();
只是关闭当前窗口,若不是主窗体的话,是无法退出程序的,另外若有托管线程(非主线程),也无法干净地退出;
关闭窗体,对象仍然存在,调用Close函数释放资源后可能还需要再次使用。
2,Application.Exit();
强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出
整个程序进程结束,项目中的所有对象都会被销毁,退出整个应用程序。
Application.Exit()就相当于Form_Closing
3,Application.ExitThread();
强制中止调用线程上的所有消息,同样面临其它线程无法正确退出的问题。
4,System.Environment.Exit(0);
这是最彻底的退出方式,不管什么线程都被强制退出,把程序结束的很干净。
5,this.dispose();
销毁对象,窗体对象被回收了,也就是不存在了,Dispose函数释放的资源不再使用。
Dispose()方法,虽然能释放当前窗体的资源,却不能强制结束循环.
this.Close(); 和 Application.Exit();对比:
this.Close()是关闭当前窗口
Application.Exit()是退出应用程序
如果当前窗口是启动消息循环的主窗口,那么两句起的作用差不多;
如果this代表的窗口对象是一个子窗口,this.Close()仅关闭一个窗口,
而Application.Exit()关闭当前所有应用程序窗体。
如何在子窗体中关闭窗口时并退出程序
1,点击退出按钮:
//退出按钮【退出按钮单独设置事件】 private void btn_exit_ClickEvent(object sender, EventArgs e) { //FrmConfirm ojbFrmConfirm = new FrmConfirm("系统退出", "是否确认要退出系统", "确认退出", "取消"); //if (ojbFrmConfirm.ShowDialog() == DialogResult.OK) //{ // //this.Dispose(); // //this.Dispose();此方法指的是释放窗体。close没有销毁实例,dispose则销毁了实例。就不是在重新使用了 // //这里使用了this.Dispose()以后,就不会再去调用Form_FormClosing了。 // //Application.Exit(); // //当执行Application.Exit();时,就激活窗体的关闭事件,从而调用该事件的处理程序Form_FormClosing // //这里调用Application.Exit();会导致Form_FormClosing实际调用2次。 // //点击关闭出发关闭事件 一次事件中,Application.Exit(); 会再次触发Form_FormClosing关闭事件 二次 // this.Close(); //} this.Close();//只是关闭当前窗口,若不是主窗体的话,是无法退出程序的 }
2,this.Close()调用FormClosing事件
private void FrmMain_FormClosing(object sender, FormClosingEventArgs e) { ////写入数据库 //if (!SysLogService.AddSysLog(new SysLog("系统退出", "触发", LogTye.操作记录, GlobalVariable.SysAdmin.LoginName))) //{ // NLogHelper.Error("日志信息写入数据库出错"); //}; //// 【自动锁屏步骤4】从应用程序的消息泵移除一个消息筛选器。如果不释放会造成很严重的内存泄漏。 //Application.RemoveMessageFilter(messageFilter); //cts.Cancel(); FrmConfirm ojbFrmConfirm = new FrmConfirm("系统退出", "是否确认要退出系统", "确认退出", "取消"); if (ojbFrmConfirm.ShowDialog() == DialogResult.OK) { #region 窗体关闭时要处理的事情 //写入数据库 if (!SysLogService.AddSysLog(new SysLog("系统退出", "触发", LogTye.操作记录, GlobalVariable.SysAdmin.LoginName))) { NLogHelper.Error("日志信息写入数据库出错"); }; // 【自动锁屏步骤4】从应用程序的消息泵移除一个消息筛选器。如果不释放会造成很严重的内存泄漏。 Application.RemoveMessageFilter(messageFilter); cts.Cancel(); #endregion e.Cancel = false; System.Environment.Exit(0); } else { e.Cancel = true; } }
其他参考退出代码:
private void btn_Exit_Click(object sender, EventArgs e) { frmMain.Close(); System.Windows.Forms.Application.Exit(); System.Environment.Exit(0);//结束进程时,关闭所有线程 这个很重要,如果没有这个代码,页面关闭了,线程还在开启着 }
private void FrmStatus_FormClosing(object sender, FormClosingEventArgs e) { DialogResult result = MessageBox.Show("确定要退出吗?", "温馨提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question); if (result == DialogResult.Yes) { } else { e.Cancel = true; } }