Приложение.Exit() против приложения.ExitThread() против среды.Exit()

StackOverflow https://stackoverflow.com/questions/1312885

Вопрос

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

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

private void CloseMyApp()
{
    SaveUserSettings();

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top