Application.Exit () против Application.ExitThread () против Environment.Exit () - PullRequest
32 голосов
/ 21 августа 2009

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

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

private void CloseMyApp()
{
    SaveUserSettings();

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

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

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

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

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

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

Ответы [ 2 ]

24 голосов
/ 21 августа 2009

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

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

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

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

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

9 голосов
/ 21 августа 2009

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...