33

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

我有这样的方法:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

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

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

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

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

4

2 回答 2

25

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

你的问题是这样的:

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

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

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

于 2009-08-21T16:51:38.307 回答
10

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

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

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

于 2009-08-21T16:16:48.737 回答