2010-09-11 25 views
3

Mon application est constituée d'une boucle de messages principale (GUI) et de threads (Task.Factory).Threads, processes et Application.Exit()

Dans les discussions que j'appelle certaines applications 3ème partie avec var p = new Process();

Mais quand j'invoque Application.Exit(); dans la boucle de message - Je vois que les processus, qui ont été commencés dans les fils sont encore dans la mémoire et sont réalisé.

Donc la question est - comment tuer tous les threads et les processus juste après Application.Exit(); a été invoqué?

UPD:

ancienne:

p.WaitForExit(); 

nouvelle:

while (!p.WaitForExit(1000)) 
{ 
    if (FlagToExit) 
    { 
     p.Kill(); 
     return; 
    } 
} 

Répondre

3

gérer l'événement Application.ApplicationExit.

+0

Donc j'ai juste besoin de créer un drapeau booléen que je dois observer dans les threads et quand il devient vrai (je l'assignerai vrai sur l'événement Application.ApplicationExit) - alors Terminer les processus? – zerkms

+0

J'ai ajouté une mise à jour, sur la façon dont je m'attends à l'implémenter. S'il vous plaît, critiquez-le. – zerkms

+0

Ce que vous avez dit devrait fonctionner. –

1

Les processus sont créés indépendamment du processus parent.

La meilleure solution est de créer un signal pour les processus enfants et de les faire sortir quand ils sont signalés, en les fermant gracieusement.

Si les processus sont en dehors de votre contrôle, alors vous devrez utiliser Process.CloseMainWindow et Process.Kill pour les tuer lorsque votre processus parent est prêt à quitter.

+0

Pourquoi 'Process.Kill' ​​ne fonctionnera-t-il pas? –

+0

Il le ferait. J'avais fait une recherche en utilisant le nom traditionnel de «Terminate», donc j'ai raté la méthode «Kill». Réponse mise à jour –

0

Créez une classe en appelant le processus et mettez-le fin à sa disposition.

8

simplement essayer ce

lorsque vous créez un fil font fil fond

Thread.IsBackground = true; 

et Application.Exit();

tous fil sera fermé

+0

-1: Ceci ne termine pas les processus fils, ce qui correspond à la moitié de la question de l'op. –

1

Cela se produit parce que tous vos fils sont Foreground. Et un thread Foreground (GUI) ne peut pas terminer un autre thread Foreground. Il vous suffit donc de marquer vos nouveaux threads comme Background et ainsi de donner une nouvelle dépendance aux nouveaux threads à votre thread Foreground (GUI). Si vous souhaitez marquer un fil comme fil Background il vous suffit d'ajouter à votre code: commande à l'intérieur comme

p.IsBackground = true; 
+6

Par conséquent, vous n'avez plus besoin d'utiliser Application.ApplicationExit. – parseh

-1

Utilisez Invoke() et exécutez le Application.Exit() ceci:

this.Invoke((Action)delegate() 
{ 
    Application.Exit(); 
});