Application.Exit() против Application.ExitThread() против Environment.Exit()

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

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

private void CloseMyApp()
{
    SaveUserSettings();

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

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

это то, что я вызываю, чтобы закрыть свое приложение из Menu --> Exit и в событии Form_FormClosing(). Application.Exit() выдает следующую ошибку -->

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

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

Application.ExitThread() работает, но я обеспокоен тем, что он может только КАЖЕТСЯ работать, и, поскольку я никогда не использовал его раньше, я не уверен, когда это обычно уместно.


person Refracted Paladin    schedule 21.08.2009    source источник


Ответы (2)


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

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

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

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

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

person Reed Copsey    schedule 21.08.2009

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

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

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

person Alan    schedule 21.08.2009
comment
Или, если вам нужно быстро выйти из строя после обнаружения ошибки в обработчике ошибок верхнего уровня, конечно, после того, как вы зарегистрируете ее, если это возможно. - person Bob King; 21.08.2009