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

Ref*_*din 32 .net c# multithreading exit winforms

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

我有一个像这样的方法:

private void CloseMyApp()
{
    SaveUserSettings();

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

    Application.ExitThread();
    //Application.Exit();
}
Run Code Online (Sandbox Code Playgroud)

这就是我所说的从菜单 - >退出Form_FormClosing()事件中关闭我的应用程序. Application.Exit()给出以下错误 - >

收集被修改; 枚举操作可能无法执行.

现在我读到这Environment.Exit()是残酷的,意味着你的应用程序可能有问题(见这里).

Application.ExitThread() 虽然有效,但我认为它可能只是出现在工作中,因为在我不确定何时通常这样做之前我从未使用它.

Ree*_*sey 24

不幸的是,问题不是由这些问题引起的,并且在所有这些场景中确实存在(即使您没有收到消息).

你的问题是这样的:

在关闭模式下关闭我的WinForm应用程序激活窗体.该表单运行一个后台工作程序,它将数据库与远程数据库同步,并在"启动表单"上显示它的进度.

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

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


Ala*_*lan 9

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

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

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