Application.Exit() vs Application.ExitThread() vs Environment.Exit() 应用程序.Exit() vs 应用程序.ExitThread() vs 环境.Exit()

33

我正在尝试弄清楚我应该使用哪个。当我关闭我的WinForm应用程序时,会启动一个以对话框模式显示的窗体。该窗体运行一个后台工作进程,将数据库与远程数据库同步,并在“闪屏窗体”上显示其进度。

我有一个如下的方法:

private void CloseMyApp()
{
    SaveUserSettings();

    splashForm = new SplashForm();
    splashForm.ShowDialog();

    Application.ExitThread();
    //Application.Exit();
}

这是我从菜单 -> 退出以及在Form_FormClosing()事件中关闭应用程序的方式。但是,Application.Exit()会出现以下错误-->

集合已修改;可能无法执行枚举操作。

我现在了解到Environment.Exit()是一种粗暴的方法,意味着您的应用程序可能存在问题(请参见此处)。

Application.ExitThread()有效,但我担心它只是表面上起作用,因为我以前从未使用过,并不确定在何时通常适用。

2个回答

25

不幸的是,问题并不是由这些情况中的任何一个引起的,并且在所有这些情况下(即使您没有收到消息),问题都确实存在。

你的问题是这样的:

关闭我的WinForm应用程序时,会触发一个以Dialog模式为形式的窗体。该窗体运行一个后台工作线程,将DB与远程DB同步,并在“Splash Form”上显示其进度。

由于您并没有实际关闭请求关闭时,所有“退出”函数都试图拆除您的后台线程。不幸的是,这可能是在您的DB同步过程中发生的,并且正在保存逻辑中进行枚举工作,从而提供了该错误。

我建议您不要使用这些功能,而是直接调用myMainForm.Close()。这应该关闭您的主窗体,从而适当地触发您的关闭逻辑。一旦您的应用程序中的主窗体关闭,它将优雅地关闭。


10

Environment.Exit() 用于控制台应用程序。

你需要使用: System.Windows.Forms.Application.Exit()

通过退出线程,你只是退出了当前线程上下文,而任何已启动的前台线程仍在运行。我怀疑引起错误的线程仍在运行,因此你实际上掩盖了问题,而不是解决它。我建议尝试找出为什么在退出时会出现错误 "Collection was modified; enumeration operation may not execute."。虽然是由 Application.Exit() 暴露出来的,但它并非其原因所在。


1
或者,如果您需要在顶级错误处理程序中捕获错误后快速失败,请在记录日志后立即执行。当然,如果可能的话。 - Bob King

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接