C# Application.Exit无法完全退出程序
当有大量对话框打开时,我在关闭程序时遇到问题。我能够使用以下函数重现这个bug。运行此操作的父窗体是使用Application.Run(mainform)创建的 单击按钮1时,它会创建一个非常基本的表单,当按下“确定”时,它会打开另一个对话框。然后启动OnShutdown()函数。等待15秒,然后尝试关闭所有窗口并退出程序。当打开6个以上的虚拟窗口时,该函数关闭所有虚拟窗口,但不关闭主窗口 我重现问题的步骤是:C# Application.Exit无法完全退出程序,c#,.net,winforms,C#,.net,Winforms,当有大量对话框打开时,我在关闭程序时遇到问题。我能够使用以下函数重现这个bug。运行此操作的父窗体是使用Application.Run(mainform)创建的 单击按钮1时,它会创建一个非常基本的表单,当按下“确定”时,它会打开另一个对话框。然后启动OnShutdown()函数。等待15秒,然后尝试关闭所有窗口并退出程序。当打开6个以上的虚拟窗口时,该函数关闭所有虚拟窗口,但不关闭主窗口 我重现问题的步骤是: 单击按钮1 关闭创建的重磅对话框 单击msgbox 再次单击按钮1 在“新建重型”
- 单击按钮1
- 关闭创建的重磅对话框
- 单击msgbox
- 再次单击按钮1
- 在“新建重型”对话框中,我按“确定”打开另一个重型对话框
- 继续打开更重的对话框,直到6-10同时打开
- 15秒结束后,所有对话框都将关闭,但父窗体仍保持打开状态,此时它应该关闭
private void button1_Click(object sender,EventArgs e) { BasicTemplate heavy = new BasicTemplate(); heavy.ShowDialog(); OnShutdown(); } private void OnShutdown() { timerSignals.Enabled=false;//quit receiving signals. string msg = ""; msg+=Process.GetCurrentProcess().ProcessName+" "; msg+=Lan.g(this,"will shut down in 15 seconds. Quickly click OK on any open windows with unsaved data."); MsgBoxCopyPaste msgbox = new MsgBoxCopyPaste(msg); msgbox.Size=new Size(300,300); msgbox.TopMost=true; msgbox.Show(); ODThread killThread = new ODThread((o) => { Thread.Sleep(15000);//15 seconds //Also happens with BeginInvoke() Invoke((Action)(() => { CloseOpenForms(true); })); Thread.Sleep(1000);//1 second Invoke((Action)Application.Exit); }); killThread.Start(true); return; } public void Start(bool isAutoCleanup) { _isAutoCleanup=isAutoCleanup; if(_thread.IsAlive) { return;//The thread is already running. } if(_hasQuit) { return;//The thread has finished. } _dateTimeStart=DateTime.Now; _thread.Start(); } //Code for "OK" button on the heavy dialog created above private void butOK_Click(object sender,EventArgs e) { BasicTemplate formp = new BasicTemplate(); formp.ShowDialog(); } private bool CloseOpenForms(bool isForceClose) { for(int f=Application.OpenForms.Count-1;f>=0;f--) { //Count backwards to avoid out of bounds if(Application.OpenForms[f]==this) { continue; } Form openForm=Application.OpenForms[f];//Copy so we have a reference to it after we close it. openForm.Hide(); if(isForceClose) { openForm.Dispose(); } else { openForm.Close();//Attempt to close the form if(openForm.IsDisposed==false) { openForm.Show();//Show that form again return false; } } } return true; }
关机序列作为线程运行,以允许用户保存在程序数据库更新之前所做的任何更改。我不确定我的实现是否正确地显示了错误,但它至少会产生类似的事件 你能提供
CloseOpenForms
方法吗?我知道我忘了什么,只是添加了它!您是否尝试过改用Environment.Exit()
?这不是一个解决方案,而是一个可能的快速解决方法。我不确定Environment.Exit()在线程中的行为,尽管它确实解决了处理其他线程的问题