2010-10-09 9 views
3

J'ai un petit formulaire qui crée deux threads de travail d'arrière-plan qui écoutent les messages de deux processus serveur distincts. Lorsque l'utilisateur tente de fermer le formulaire, je gère l'événement OnFormClosing (ou ils peuvent cliquer sur un élément de menu Quitter) qui appelle CancelAsync() sur les deux threads. Le formulaire attend ensuite jusqu'à ce que la propriété IsBusy pour les deux threads soit "FALSE" avant d'appeler Environment.Exit (0).Environment.Exit() provoque le blocage de mon application après l'utilisation de Process.Start

Voici la capture: À partir de ce formulaire, l'utilisateur peut lancer une application distincte. Ceci est fait en utilisant Process.Start quand un bouton spécifique est cliqué. Si l'utilisateur a créé un nouveau processus via le formulaire, puis ferme le formulaire, au lieu de quitter gracieusement il se bloque et je reçois un de ces messages d'erreur Windows. Application.Exit ne fonctionne pas car il ne fermera pas le formulaire pour une raison inconnue de moi. Je suis certain que les deux threads sont terminés car je gère l'événement RunWorkerCompleted pour les deux threads. Voici un shell du code principal:

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

Des idées sur ce qui causerait le plantage sur Environment.Exit?

+0

Avez-vous regardé le journal des événements? Il consignera l'erreur exacte. – Aliostad

+0

Voici ce qu'il lit: "EventType clr20r3; P1 ccs_wsdt.exe, P2 1.0.0.0 P3 4cb0eeb3 .P4 système.windows.forms.P5 2.0.0.0.P6 471ebf68.P7 16c6.P8 159. P9 system.componentmodel. win32 P10 NIL " Aucune idée de comment interpréter cela. Le code/application est exécuté sur un réseau hors ligne, je dois donc taper manuellement tout ici. – alexD

Répondre

3

Essayez

Application.Exit() 

depuis que vous utilisez Windows Forms. Je n'ai pas fait un cas de test par moi-même, mais je suis assez sûr que les API Winforms sont mécontents sur la fin immédiate d'un processus via l'environnement, qui utilise les API du noyau.

J'ai aussi trouvé ceci: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx

+0

J'ai essayé application.Exit ... il ne quitte pas mon application. – alexD

+0

En fait, après avoir corrigé d'autres choses, j'ai essayé à nouveau Application.Exit et il se bloque également. – alexD

+1

Pouvez-vous attraper une exception quelque part? Essayez d'accrocher à Application.ThreadException et de faire MessageBox.Show (ex.ToString), il pourrait vous aider plus! –

0

Que diriez-vous

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