У меня есть небольшая форма, которая создает два фоновых рабочих потока, которые прослушивают сообщения от двух отдельных процессов сервера. Когда пользователь пытается закрыть форму, я обрабатываю событие OnFormClosing (или они могут щелкнуть элемент меню «Выход»), которое вызывает метод CancelAsync () в обоих потоках. Затем форма ждет, пока свойство IsBusy для обоих потоков не станет «ЛОЖЬ», прежде чем вызывать Environment.Exit (0).
Вот подвох: из этой формы пользователь может запускать отдельное приложение. Это делается с помощью Process.Start при нажатии определенной кнопки. Если пользователь создал новый процесс через форму, а затем закрывает форму, вместо того, чтобы грациозно завершить работу, он падает, и я получаю одно из этих сообщений об ошибках Windows. Application.Exit не работает, потому что не закрывает форму по неизвестной мне причине. Я уверен, что оба потока завершены, потому что я обрабатываю событие RunWorkerCompleted для обоих потоков. Вот оболочка основного кода:
private void startProcess_buttonClick(sender, e)
{
Process.Start(<process args>);
}
protected override OnFormClosing()
{
e.Cancel = true;
if (!thread1.IsBusy && !thread2.IsBusy)
Environment.Exit(0);
stopThreads();
}
private void stopThreads()
{
if (thread1.IsBusy)
thread1.CancelAsync();
if (thread2.IsBusy)
thread2.CancelAsync();
}
private void thread1_RunWorkerCompleted(sender, e)
{
if (!thread2.IsBusy)
Environment.Exit(0);
}
private void thread2_RunWorkerCompleted(sender, e)
{
if (!thread1.IsBusy)
Environment.Exit(0);
}
Есть идеи о том, что может вызвать сбой в Environment.Exit?