【问题标题】:Application.Exit() vs Application.ExitThread() vs Environment.Exit()Application.Exit() vs Application.ExitThread() vs Environment.Exit()
【发布时间】:2010-11-21 17:22:01
【问题描述】:

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

我有这样的方法:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

这是我从 Menu --> ExitForm_FormClosing() 事件中关闭我的应用程序的调用。 Application.Exit() 给出以下错误 -->

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

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

Application.ExitThread() 可以工作,但我承认它可能只是看起来可以工作,因为我从来没有使用过它,在我不确定通常何时适合这样做之前。

【问题讨论】:

    标签: c# .net winforms multithreading exit


    【解决方案1】:

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

    你的问题是这样的:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      通过退出线程,您只是退出当前线程上下文,同时让任何已启动的前台线程继续运行。我怀疑导致错误的线程仍在运行,所以你基本上掩盖了问题,没有解决它。我会尝试找出为什么您在退出时收到此错误"Collection was modified; enumeration operation may not execute."。被Application.Exit()曝光,但不是它造成的。

      【讨论】:

      • 或者如果您需要在顶级错误处理程序中捕获错误后快速失败,当然,如果可能的话,在您记录它之后。
      猜你喜欢
      • 2012-10-14
      • 1970-01-01
      • 2011-06-25
      • 2014-08-17
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多