Application.Exit()vs Application.ExitThread()vs Environment.Exit()

时间:2009-08-21 16:10:19

标签: c# .net winforms multithreading exit

我想知道我应该使用哪个。关闭我的WinForm应用程序在对话模式下触发一个窗体。该表单运行一个后台工作程序,它将数据库与远程数据库同步,并在“启动表单”上显示它的进度。

我有一个像这样的方法:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

这就是我打电话从菜单关闭我的应用程序 - >退出并在Form_FormClosing()事件中退出。 Application.Exit()出现以下错误 - >

  

收藏被修改;枚举操作可能无法执行。

现在我读到Environment.Exit()是残酷的,这意味着您的应用可能存在问题(请参阅here)。

Application.ExitThread()有效,但我认为它可能只是出现在工作中,因为在我不确定通常是否合适之前我从未使用它。

2 个答案:

答案 0 :(得分:24)

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

你的问题是:

  

关闭我的WinForm应用程序在对话框模式下触发表单。该表单运行一个后台工作程序,它将数据库与远程数据库同步,并在“启动表单”上显示它的进度。

由于您在请求关闭时实际上没有关闭,所以所有“退出”功能都试图拆除后台线程。不幸的是,这可能发生在数据库同步的中间,并且在保存逻辑中工作的枚举可能会提供该错误。

我建议不要使用其中任何一种 - 只需拨打myMainForm.Close()即可。这应该关闭你的主表单,这将适当地触发你的结束逻辑。一旦应用程序中的主窗体关闭,它就会正常关闭。

答案 1 :(得分:9)

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

您想要使用:System.Windows.Forms.Application.Exit()

通过退出线程,您只退出当前线程上下文,同时保持任何已启动的前台线程运行。我怀疑导致错误的线程仍在运行,所以你基本上掩盖了问题,而不是解决它。我会尝试找出你在退出时收到此错误"Collection was modified; enumeration operation may not execute."的原因。它被Application.Exit()暴露,但它不是由它引起的。