2011-07-16 4 views
2

J'ai un peu de mal à essayer de mettre fin à un processus, je me rends compte qu'il y a pas mal de recours sur ce site seul, mais je me demandais s'il y avait d'autres moyens de terminer une application plutôt que quelque chose typique comme:Autres méthodes pour tuer un processus en cours en C#

Process[] procs = Process.GetProcessesByName("test.exe"); 
    foreach (Process proc in procs) 
     proc.Kill(); 
+6

Vous pouvez tirer le câble sous tension. –

+0

@Henk Holterman lol +1 si je pouvais voter: P – James

+3

Pourquoi avez-vous besoin d'un moyen alternatif, ne fonctionne pas 'Process.Kill'? –

Répondre

2

Il y a Process.CloseMainWindow, qui demande bien le processus de cesser de fumer (par opposition à Process.Kill, qui tire le processus et peut avoir des effets secondaires négatifs).

+1

Malheureusement, dans ce cas, ce type d'approche ne serait pas approprié :( – James

+9

@James: Je vois.Pour augmenter la probabilité de réponses utiles, je vous recommande de modifier votre question et ajouter (1) pourquoi CloseMainWindow (qui est la méthode recommandée pour fermer d'autres applications) est inadapté et (2) quels sont les problèmes auxquels vous êtes actuellement confronté lors de l'utilisation de Process.Kill.Lorsque vous suggérez des alternatives, il est toujours bon de savoir * pourquoi * la solution actuelle n'est pas bonne. – Heinzi

+1

Cela ne fonctionne tout simplement pas lorsque Process.ProcessStartInfo.CreateNoWindow a la valeur true. CloseMainWindow retourne juste false et rien ne se passe, donc cela est inutile pour les situations où l'on est en train de démarrer des processus en arrière-plan, tels que des applications console, sans fenêtres individuelles. Ce dont nous avons vraiment besoin, c'est d'un moyen fonctionnel d'envoyer un message de contrôle à un processus, car GenerateConsoleCtrlEvent (http://msdn.microsoft.com/en-us/library/windows/desktop/ms683155(v=vs.85).aspx) ne peut pas envoyer le message à un processus arbitraire et a toutes sortes d'autres limitations qui le rendent inutile aussi bien. – Triynko

1

Il n'y a que 2 façons en C# de fermer le processus (AFAIK) en utilisant Process.Kill() et Process.CloseMainWindow(), Kill envoie un signal KILL immédiat à l'application et l'oblige à se fermer immédiatement. CloseMainWindow utilise SendWindowMessage pour envoyer un signal CLOSE à l'application principale. Tuer peut être dangereux car il arrête immédiatement le processus. CloseMainWindow peut être suivi par Process.WaitForExit afin que vous soyez sûr que l'application s'est fermée et peut continuer à fonctionner en sachant que le processus que vous avez demandé de quitter s'est terminé correctement. Comme posté par le commentaire de Heinzi s'il vous plaît être un peu plus précis J'essaie juste de développer ce qui a été dit dans l'espoir que c'est ce dont vous avez besoin.

0

Cette idée n'est pas bonne. Il pourrait y avoir un autre processus en cours avec ce nom. Voulez-vous que tout processus avec ce nom soit terminé? Sauf si vous écrivez un type d'application Task Manager/Process Explorer, vous ne devriez jamais le faire. Et même avec le type d'application TM, vous fermez le processus en saisissant son objet handle/Process, et non par son nom.

Tu ne peux pas demander au processus cible de se fermer correctement? Peut être que vous pouvez utiliser un mutex nommé, le thread cible attendrait sur ce mutex. Lorsque vous signalez que named-mutex provient d'un autre processus, le thread cible sait qu'il est temps de quitter et éventuellement de quitter.

0

Très simple, juste besoin d'obtenir le nom du processus et le tuer, ne pas essayer de faire quoi que ce soit de fantaisie, parfois moins est plus ...

Process[] prs = Process.GetProcesses(); 


foreach (Process pr in prs) 
{ 
if (pr.ProcessName == "test") 
{ 

pr.Kill(); 

} 

} 
Questions connexes