2010-10-09 4 views
3

У меня есть небольшая форма, которая создает два потока рабочего потока, которые прослушивают сообщения из двух отдельных процессов сервера. Когда пользователь пытается закрыть форму, я обрабатываю событие OnFormClosing (или они могут щелкнуть элемент «Выход»), который вызывает CancelAsync() для обоих потоков. Затем форма ждет, пока свойство IsBusy для обоих потоков не будет «FALSE» перед вызовом среды. Exit (0).Environment.Exit() заставляет мое приложение сбой после использования Process.Start

Вот улов: из этой формы пользователь может запустить отдельное приложение. Это делается с помощью 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); 
} 

Любые идеи относительно того, что может вызвать сбой в среде. Exit?

+0

Вы смотрели на журнал событий? Он регистрирует точную ошибку. – Aliostad

+0

Вот что он читает: «EventType clr20r3; P1 ccs_wsdt.exe, P2 1.0.0.0. P3 4cb0eeb3. P4 system.windows.forms. P5 2.0.0.0. P6 471ebf68. P7 16c6. P8 159. P9 system.componentmodel. win32. P10 NIL " Не знаю, как это интерпретировать. Код/приложение запускается в автономной сети, поэтому мне нужно вручную вводить все здесь. – alexD

ответ

3

Попробуйте

Application.Exit() 

, так как вы бежите Windows Forms. Я сам не сделал тестовый пример, но я уверен, что API Winforms unhappy о немедленном завершении процесса через среду, которая использует API-интерфейсы ядра.

Я также нашел это: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

+0

Я пробовал application.Exit ... он не выходит из моего приложения. – alexD

+0

На самом деле, после исправления некоторых других вещей, я попробовал Application.Exit снова, и он также сбой. – alexD

+1

Можете ли вы кого-нибудь поймать? Попробуйте подключиться к Application.ThreadException и сделать MessageBox.Show (ex.ToString), это может помочь вам больше! –

0

Как насчет

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(); 
}