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;
            }
        }

  

posted @ 2020-10-10 22:08  包子789654  阅读(1704)  评论(0编辑  收藏  举报