我想知道我应该使用哪个。关闭我的WinForm应用程序在对话模式下触发一个窗体。该表单运行一个后台工作程序,它将数据库与远程数据库同步,并在“启动表单”上显示它的进度。
我有一个像这样的方法:
private void CloseMyApp()
{
SaveUserSettings();
splashForm = new SplashForm();
splashForm.ShowDialog();
Application.ExitThread();
//Application.Exit();
}
这就是我打电话从菜单关闭我的应用程序 - >退出并在Form_FormClosing()
事件中退出。 Application.Exit()
出现以下错误 - >
收藏被修改;枚举操作可能无法执行。
现在我读到Environment.Exit()
是残酷的,这意味着您的应用可能存在问题(请参阅here)。
Application.ExitThread()
有效,但我认为它可能只是出现在工作中,因为在我不确定通常是否合适之前我从未使用它。
答案 0 :(得分:24)
不幸的是,问题不是由这些问题引起的,并且在所有这些情况下确实存在(即使您没有收到消息)。
你的问题是:
关闭我的WinForm应用程序在对话框模式下触发表单。该表单运行一个后台工作程序,它将数据库与远程数据库同步,并在“启动表单”上显示它的进度。
由于您在请求关闭时实际上没有关闭,所以所有“退出”功能都试图拆除后台线程。不幸的是,这可能发生在数据库同步的中间,并且在保存逻辑中工作的枚举可能会提供该错误。
我建议不要使用其中任何一种 - 只需拨打myMainForm.Close()
即可。这应该关闭你的主表单,这将适当地触发你的结束逻辑。一旦应用程序中的主窗体关闭,它就会正常关闭。
答案 1 :(得分:9)
Environment.Exit()
用于控制台应用。
您想要使用:System.Windows.Forms.Application.Exit()
通过退出线程,您只退出当前线程上下文,同时保持任何已启动的前台线程运行。我怀疑导致错误的线程仍在运行,所以你基本上掩盖了问题,而不是解决它。我会尝试找出你在退出时收到此错误"Collection was modified; enumeration operation may not execute."
的原因。它被Application.Exit()
暴露,但它不是由它引起的。