Environment.Exit () вызывает сбой моего приложения после использования Process.Start - PullRequest
3 голосов
/ 10 октября 2010

У меня есть небольшая форма, которая создает два фоновых рабочих потока, которые прослушивают сообщения от двух отдельных процессов сервера. Когда пользователь пытается закрыть форму, я обрабатываю событие 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?

Ответы [ 2 ]

3 голосов
/ 10 октября 2010

Попробуйте

Application.Exit()

, поскольку вы используете Windows Forms.Я сам не тестировал, но уверен, что API-интерфейсы Winforms недовольны по поводу немедленного завершения процесса через среду, в которой используются API-интерфейсы ядра.также нашел это: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

0 голосов
/ 13 октября 2010

Как насчет

protected override OnFormClosing()
{
    e.Cancel = true;

    if (!thread1.IsBusy && !thread2.IsBusy)
       this.Close();

    stopThreads();
}
private void thread1_RunWorkerCompleted(sender, e)
{
       if (!thread2.IsBusy)
          this.Close();
}
private void thread2_RunWorkerCompleted(sender, e)
{
       if (!thread1.IsBusy)
          this.Close();
}
...