Winforms Application.Exit 关闭 x 应用程序或单击带有确认消息的退出按钮

Winforms Application.Exit on Closing x app or clicking a Exit Button with a confirmation message

我正在使用 Telerik WinForm (2019.2.618.40) 控件开发 WinForms (.NET 4.7.2) 应用程序。

单击 window 顶部的关闭框 [x] 图标,我想请求用户确认,如果是,则关闭应用

以下代码运行良好,它关闭了 window,但它 不是 关闭过程(我仍然可以在 任务管理器中看到该应用程序).

我想我需要调用 Application.Exit(); 来终止应用进程。但是当我调用 Closing Event 被触发两次并且我得到确认 window 两次并得到以下错误

System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.'

如何更正我的关闭事件,以便我可以请求用户确认并关闭 windows 以及从任务管理器中彻底退出应用程序?

我的基础表格

public class BaseForm : Telerik.WinControls.UI.RadForm
    {
        public BaseForm()
        {
           this.FormClosing += new FormClosingEventHandler(Form_Closing);
        }
        public void Form_Closing(object sender, System.ComponentModel.CancelEventArgs e)
    {
        RadMessageBox.SetThemeName("Material");
        DialogResult dialogResult = RadMessageBox.Show(
                 this,
                 "Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
                 "Application Name",
                 MessageBoxButtons.YesNo,
                 RadMessageIcon.Question,
                 MessageBoxDefaultButton.Button2,
                 RightToLeft.No);
        if (dialogResult == DialogResult.Yes)
        {
            e.Cancel = false;
            //Application.Exit();
        }
        else if (dialogResult == DialogResult.No)
        {
            e.Cancel = true;
        }
        base.OnClosing(e);
    }


     //....
     //....
     //....
    }

更新


而不是 FormClosign 事件,如果我使用 FormClosed 事件,Application.Exit() 工作正常,但如果我点击确认消息不,它仍在关闭应用程序。

this.FormClosed += new FormClosedEventHandler(App_kill);

App Kill 方法(无法处理 DialogResult.No 响应)

private void App_kill(object sender, FormClosedEventArgs e)
        {

            if (e.CloseReason == CloseReason.UserClosing)
            {
                RadMessageBox.SetThemeName("Material");
                DialogResult dialogResult = RadMessageBox.Show(
                         this,
                         "Are you sure, you want to exit out of the application? Any unsaved data will be lost!",
                         "Close Application",
                         MessageBoxButtons.YesNo,
                         RadMessageIcon.Question,
                         MessageBoxDefaultButton.Button2,
                         RightToLeft.No);
                if (dialogResult == DialogResult.Yes)
                {
                    Application.Exit();
                }

                if (dialogResult == DialogResult.No)
                {
                    //e.Cancel = true;
                }
            }
        }

感谢nihique posted here 并在此问题评论中由 MickyD 指出。

显然我的结束活动没有问题。当我从 Form-A 重定向到 Form-B 时,我必须进行以下接线,然后它就像一个魅力

 var newform = new myNewForm();
  newform.Closed += (s, args) => this.Close();
  this.Hide();
  newform.Show();