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

Я пытаюсь выяснить, что я должен использовать. При закрытии моего приложения WinForm срабатывает режим Form in Dialog. В этой форме работает фоновый рабочий, который синхронизирует БД с удаленным БД и отображает его прогресс в "форме всплеска".

У меня есть такой способ:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

который я вызываю, чтобы закрыть мое приложение из Меню → Выход и в событии Form_FormClosing(). Application.Exit() дает следующую ошибку →

Коллекция была изменена; операция перечисления не может выполняться.

Теперь я прочитал, что Environment.Exit() является жестоким и означает, что, возможно, что-то не так с вашим приложением (см. здесь).

Application.ExitThread() работает, но я убежден, что он может быть только APPEARING работать, и поскольку я никогда не использовал его, прежде чем я не уверен, когда это обычно подходит для этого.

Ответ 1

К сожалению, проблема не вызвана ни одним из них и действительно существует (даже если вы не получаете сообщение) во всех этих сценариях.

Ваша проблема заключается в следующем:

При закрытии моего приложения WinForm запускается режим формы в диалоговом режиме. Эта форма запускает фоновый рабочий, который синхронизирует БД с удаленным БД и отображает его прогресс в "Форме всплеска".

Так как вы не закрываете панель, когда вы запрашиваете завершение работы, все функции "Выход" пытаются снести фоновый поток. К сожалению, это, вероятно, происходит в середине вашей синхронизации БД, и перечисление, работающее в логике сохранения, вероятно, обеспечивает эту ошибку.

Я бы рекомендовал не использовать какие-либо из них - просто позвоните myMainForm.Close(). Это должно закрыть вашу основную форму, которая соответствующим образом устранит вашу логику закрытия. Как только основная форма приложения закрывается, он будет изящно закрыт.

Ответ 2

Environment.Exit() используется для консольных приложений.

Вы хотите использовать: System.Windows.Forms.Application.Exit()

Извлекая поток, вы выходите из контекста текущего потока, оставляя запущенные запущенные потоки переднего плана. Я подозреваю, что поток, вызывающий ошибку, все еще работает, поэтому вы по существу замаскировали проблему, а не работали вокруг нее. Я попытался бы выяснить, почему вы получаете эту ошибку "Collection was modified; enumeration operation may not execute." при выходе. Он подвергается Application.Exit(), но не вызван им.