解决方案:
1.主窗体中退出按钮的代码
Application.Exit();->改为 this.Dispose();
2.主窗体中修改子窗体的弹出方式由Show 改为
ShowDialog()
并在DialogREsult返回时,用
this.Close()将
主窗体关闭。千万不能用Application.Exit();
3.子窗体中的退出按钮将“
Application.Exit();” 改为 “
this.DialogResult = DialogResult.OK;“
Application.Exit 是一种强行退出方式,就像 Win32 的 PostQuitMessage()。它意味着放弃所有消息泵,展开调用堆栈,并将执行返回给系统。
在 Windows(Win32 或 .NET)中关闭应用程序的正确方式是关闭它的主应用程序窗口(例如 Form.Close)。主消息泵结束后依然存在的任何窗口都需要手动关闭。在应用程序退出之前通过调用 Form.Close 或 Form.Dispose 来关闭窗口是清除窗口的良好做法,但这需要您有意识地去做。我们需要记住,.NET Framework 的 OnClosing() 是 Win32 的托管版本的 WM_CLOSE,而非 WM_DESTROY。
另外,如果您使用 form.Close(),通过处理 OnClosing 或 OnClosed 事件,就可以让您的应用程序清理内容、关闭文件等。如果您通过 Application.Exit 强行退出应用程序,就无法调用这些事件。
补充:
因为我的窗体显示模式是 Login(主窗体) ->Main -> Other
故,当从Other退至Main时,再从Main退出,还是有此神秘错误,
故
this.Dispose();并没有释放掉Other里面的一些资源,比如ListCollection或是Service等等
采用强制“
System.Diagnostics.Process.GetCurrentProcess().Kill();
” 来把进程彻底杀死。