Application.Exit() против Application.ExitThread() против Environment.Exit()
Я пытаюсь понять, что я должен использовать. При закрытии моего приложения WinForm формы запускаются в режиме диалога. Эта форма запускает фоновый рабочий, который синхронизирует базу данных с удаленной базой данных и отображает ее ход в "форме всплеска".
У меня есть такой метод:
private void CloseMyApp()
{
SaveUserSettings();
splashForm = new SplashForm();
splashForm.ShowDialog();
Application.ExitThread();
//Application.Exit();
}
это то, что я звоню, чтобы закрыть свое приложение из меню -> Выход и в Form_FormClosing()
событие. Application.Exit()
выдает следующую ошибку ->
Коллекция была изменена; Операция перечисления может не выполняться.
Сейчас читаю Environment.Exit()
является жестоким и означает, что, вероятно, что-то не так с вашим приложением (см. здесь).
Application.ExitThread()
работает, но я согласен с тем, что это может быть только видимость на работе, и, поскольку я никогда не использовал его раньше, я не уверен, когда это обычно уместно сделать это.
2 ответа
К сожалению, проблема не вызвана ни одним из них, и действительно существует (даже если вы не получаете сообщение) во всех этих сценариях.
Ваша проблема заключается в следующем:
При закрытии моего WinForm App запускает форму в режиме диалога. Эта форма запускает фоновый рабочий, который синхронизирует базу данных с удаленной базой данных и отображает ее ход в "форме всплеска".
Поскольку при запросе на выключение вы фактически не выключаетесь, все функции "Выход" пытаются разрушить фоновый поток. К сожалению, это, вероятно, происходит во время синхронизации вашей БД, и перечисление, работающее в логике сохранения, вероятно, обеспечивает эту ошибку.
Я бы порекомендовал не использовать ни один из них - просто позвоните myMainForm.Close()
вместо. Это должно закрыть вашу основную форму, которая будет запускать вашу логику закрытия соответствующим образом. Как только основная форма в вашем приложении закроется, она будет корректно закрыта.
Environment.Exit()
используется для консольных приложений.
Вы хотите использовать: System.Windows.Forms.Application.Exit()
Выходя из потока, вы выходите только из текущего контекста потока, оставляя все запущенные потоки переднего плана работающими. Я подозреваю, что поток, который вызывает ошибку, все еще работает, поэтому вы по существу замаскировали проблему, а не обошли ее стороной. Я бы попытался выяснить, почему вы получаете эту ошибку "Collection was modified; enumeration operation may not execute."
на выходе. Это подвергается Application.Exit()
, но это не вызвано этим.