Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Application.Exit无法完全退出程序_C#_.net_Winforms - Fatal编程技术网

C# Application.Exit无法完全退出程序

C# Application.Exit无法完全退出程序,c#,.net,winforms,C#,.net,Winforms,当有大量对话框打开时,我在关闭程序时遇到问题。我能够使用以下函数重现这个bug。运行此操作的父窗体是使用Application.Run(mainform)创建的 单击按钮1时,它会创建一个非常基本的表单,当按下“确定”时,它会打开另一个对话框。然后启动OnShutdown()函数。等待15秒,然后尝试关闭所有窗口并退出程序。当打开6个以上的虚拟窗口时,该函数关闭所有虚拟窗口,但不关闭主窗口 我重现问题的步骤是: 单击按钮1 关闭创建的重磅对话框 单击msgbox 再次单击按钮1 在“新建重型”

当有大量对话框打开时,我在关闭程序时遇到问题。我能够使用以下函数重现这个bug。运行此操作的父窗体是使用Application.Run(mainform)创建的

单击按钮1时,它会创建一个非常基本的表单,当按下“确定”时,它会打开另一个对话框。然后启动OnShutdown()函数。等待15秒,然后尝试关闭所有窗口并退出程序。当打开6个以上的虚拟窗口时,该函数关闭所有虚拟窗口,但不关闭主窗口

我重现问题的步骤是:

  • 单击按钮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;
    }
    
当第3行的“heavy.ShowDialog()”更改为“heavy.Show()”时,将不再发生阻塞。当使用不同的按钮打开多个沉重的对话框时,问题不再发生(最多20个新对话框)


关机序列作为线程运行,以允许用户保存在程序数据库更新之前所做的任何更改。我不确定我的实现是否正确地显示了错误,但它至少会产生类似的事件

你能提供
CloseOpenForms
方法吗?我知道我忘了什么,只是添加了它!您是否尝试过改用
Environment.Exit()
?这不是一个解决方案,而是一个可能的快速解决方法。我不确定Environment.Exit()在线程中的行为,尽管它确实解决了处理其他线程的问题