web-dev-qa-db-fra.com

Quelles sont les différences entre le processus de suppression et le processus de fermeture?

Lorsque je démarre un processus et que je souhaite le fermer, quelles sont les différences entre Process.Close() et Process.Kill()?

J'ai demandé parce que j'ai une application qui commence à capturer des paquets en utilisant Wireshark avec une commande via la ligne de commande avec Windows = hidden. donc quand je veux arrêter la capture je tue le processus. Donc parfois la capture s'ouvre avec une erreur que le dernier paquet a été coupé au milieu donc je me demande peut utiliser close() avant kill() résoudra ce problème?

Lorsque je commence la capture, je peux la fermer en appuyant sur Ctrl + C mais dans mon cas, j'ouvre la fenêtre à l'état masqué, puis-je faire quelque chose de similaire via mon code?

59
user1710944

Quelles sont les différences entre Process.Close() et process.Kill()?

Le manuel est assez clair à ce sujet:

Process.Close() :

La méthode Close fait que le processus cesse d'attendre la sortie s'il était en attente, ferme le descripteur de processus et efface les propriétés spécifiques au processus. Fermer ne ferme pas les lecteurs et enregistreurs standard de sortie, d'entrée et d'erreur s'ils sont référencés en externe. [c'est à dire. le processus lui-même continue de fonctionner, vous ne pouvez plus le contrôler à l'aide de votre instance Process]

Process.Kill() :

Kill force l'arrêt du processus, tandis que CloseMainWindow ne demande qu'une interruption. [...] La demande de sortie du processus en appelant CloseMainWindow ne force pas l'application à se fermer. L'application peut demander une vérification de l'utilisateur avant de quitter, ou elle peut refuser de quitter. Pour forcer l'application à se fermer, utilisez la méthode Kill. Le comportement de CloseMainWindow est identique à celui d'un utilisateur fermant la fenêtre principale d'une application à l'aide du menu système. Par conséquent, la demande de quitter le processus en fermant la fenêtre principale ne force pas l'application à se fermer immédiatement.

Process.CloseMainWindow :

Ferme un processus doté d'une interface utilisateur en envoyant un message de fermeture à sa fenêtre principale.


Quant à votre montage:

j'ai demandé parce que j'ai une application qui commence à capturer le paquet à l'aide de Wireshark avec la commande via la ligne de commande avec Windows = caché.

tilisez l'API WinPcap ou la bibliothèque Pcap.Net pour cela , pas Wireshark.

63
CodeCaster

Kill demande au système de terminer le processus sans cérémonie (via un appel à Windows TerminateProcess appel système) . Cela s'apparente à Fin du processus dans le Gestionnaire des tâches.

Fermer ferme la poignée du processus dans .NET, mais ne touche pas réellement le processus lui-même. Close est également appelé par Dispose. Voir cette réponse par Jon Skeet.

Une troisième option est CloseMainWindow , qui le fait fermez le programme avec élégance en demandant à la fenêtre principale de se fermer. Cela revient à cliquer avec le bouton droit sur le programme dans la barre des tâches et à choisir Fermer.

15
David Pfeffer

Kill et Close ne sont pas deux options. Kill (ou CloseMainWindow) doit être appelé si vous souhaitez mettre fin à un processus. L'appel de Close ne fera que libérer des ressources, mais ne fermera pas les flux standard. La fermeture des flux vous-même peut ou non entraîner la fin du processus, cela dépend du processus. La meilleure stratégie consiste à appeler Kill ou CloseMainWindow selon le type de processus, puis à supprimer l'objet Process.

Fermer commence la fermeture de l'objet Process. Il est appelé par Dispose. Close est généralement utilisé pour gérer les ressources de l'objet Process.

Kill termine le processus. C'est le seul moyen de mettre fin à un processus qui n'a pas d'interface utilisateur.

CloseMainWindow envoie un message de fermeture à la fenêtre principale du processus. Il s'agit de la manière élégante d'arrêter un processus doté d'une interface utilisateur.

6
Fls'Zen

Permettez-moi d'illustrer visuellement ce qui se passe lorsque vous appelez Close () et Kill (). Ce qui suit ouvrira le Bloc-notes mais ne quittera pas le bloc-notes à la fin lorsque myProcess.Close () s'exécute.

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Close();

ce qui suit ouvrira le Bloc-notes. après 10 secondes, le bloc-notes se fermera à la fin de l'exécution de myProcess.Kill ().

Process myProcess;
myProcess = Process.Start("Notepad.exe");
Thread.Sleep(10000);
myProcess.Kill();
4
yantaq

Process.Kill appelle TerminateProcess.

Process.Close ne fait pas ce que vous pensez qu'il fait! Il libère simplement les ressources utilisées par l'instance de la classe. Veuillez lire ceci: http://msdn.Microsoft.com/en-us/library/system.diagnostics.process.close.aspx

1
wj32