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

Другие вопросы по тегам