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()
, но не вызван им.