2012-12-19 12 views
48

Wenn ich einen Prozess zu starten und will diesen Prozess schließen, was sind die Unterschiede zwischen Process.Close() und Process.Kill()?Was sind die Unterschiede zwischen Kill-Prozess und Close-Prozess?

Ich fragte, weil ich eine Anwendung habe, die beginnt, Paket mit Wireshark mit einem Befehl über die Befehlszeile mit Windows = hidden zu erfassen. so, wenn ich die Aufnahme beenden will töten I der Prozess manchmal .So die Erfassung mit einem Fehler öffnet, dass das letzte Paket in der Mitte geschnitten wurde, so dass ich frage mich, mit close() vor kill() werde dieses Problem lösen?

Wenn ich anfangen Erfassung ich es durch Drücken von Strg + C schließen kann, aber in meinem Fall öffne ich das Fenster im Zustand versteckt, kann ich etwas tun ähnlich über meinen Code?

+2

http://stackoverflow.com/questions/673031/process-close-is-not-terminating-created-process-c –

Antwort

50

Was sind die Unterschiede zwischen Process.Close() und process.Kill() sind?

Das Handbuch ist ziemlich klar auf, dass:

Process.Close():

Die Close-Methode den Prozess verursacht Warten auf Ausgang zu stoppen, wenn sie wartete, schließt den Prozess Griff und löscht Prozess -spezifische Eigenschaften. Schließen schließt die Standardausgabe-, Eingabe- und Fehlerleser und -schreiber nicht, wenn sie extern referenziert werden. [d.h. der Prozess selbst am Laufen hält, können Sie einfach kontrollieren es nicht mehr Ihre Process Instanz mit]

Process.Kill():

Tötung eine Beendigung des Prozesses zwingt, während Closemainwindow nur eine Beendigung anfordert. [...] Die Anforderung, den Prozess durch Aufrufen von CloseMainWindow zu beenden, erzwingt kein Beenden der Anwendung. Die Anwendung kann vor dem Beenden eine Benutzerüberprüfung anfordern oder sie kann den Abbruch verweigern. Verwenden Sie die Kill-Methode, um das Beenden der Anwendung zu erzwingen. Das Verhalten von CloseMainWindow ist identisch mit dem eines Benutzers, der das Hauptfenster einer Anwendung über das Systemmenü schließt. Die Anforderung, den Prozess durch Schließen des Hauptfensters zu beenden, erzwingt daher nicht, dass die Anwendung sofort beendet wird.

Process.CloseMainWindow:

Schließt einen Prozess, der durch das Senden einer Nachricht an ihr Schließen Hauptfenster eine Benutzerschnittstelle aufweist.


Was Ihre edit:

fragte ich, weil ich Anwendung habe, das Startpaket erfassen wireshark über die Kommandozeile mit dem Befehl unter Verwendung von Windows = versteckt.

Use the WinPcap API oder die Pcap.Net library for that, nicht Wireshark.

+0

Wenn ich mit dem Capturen beginne, kann ich es schließen, indem ich Strg + C drücke, aber in meinem Fall öffne ich das Fenster im versteckten Zustand, kann ich etwas damit anfangen? – user1710944

+0

@ user1710944 Ich verstehe Ihren Kommentar nicht, aber Sie sollten wirklich in die WinPcap API schauen. Das Ausführen von Programmen in versteckten Fenstern ist nicht wirklich die empfohlene Methode, um ihre Logik und Daten zu nutzen. Dafür sind APIs gedacht. – CodeCaster

10

Kill fragt das System zu unsanft den Prozess zu beenden (über einen Aufruf des Windows-TerminateProcess Systemaufruf). Dies ähnelt dem Prozess im Task-Manager.

Close schließt den Griff nach dem Prozess in .NET, aber nicht berührt tatsächlich den Prozess selbst. Close wird auch von Dispose genannt. Siehe this answer von Jon Skeet.

Eine dritte Option ist CloseMainWindow, die tut anmutig heruntergefahren das Programm, indem Sie das primäre Fenster zum Schließen aufgefordert. Dies ist vergleichbar mit der rechten Maustaste auf das Programm in der Taskleiste und wählen Sie Schließen.

+0

Natürlich nur Closemainwindow die Anwendung beenden, wenn die Anwendung Setup ist zu beenden, wenn Das Hauptfenster ist geschlossen. –

4

Kill and Close sind keine zwei Optionen. Kill (oder CloseMainWindow) muss aufgerufen werden, wenn Sie einen Prozess beenden möchten. Wenn Sie auf Schließen klicken, werden nur Ressourcen freigegeben, die Standard-Streams werden jedoch nicht geschlossen. Wenn Sie die Streams selbst schließen, kann dies zu einem Ende des Prozesses führen. Dies hängt jedoch vom Prozess ab. Die beste Strategie besteht darin, Kill oder CloseMainWindow abhängig von der Art des Prozesses aufzurufen und dann das Process-Objekt zu entsorgen.

Close beginnt mit dem Schließen des Process-Objekts. Es heißt von Dispose. Schließen wird normalerweise zum Verwalten der Ressourcen des Process-Objekts verwendet.

Kill beendet den Prozess. Dies ist die einzige Möglichkeit, einen Prozess ohne Benutzerschnittstelle zu beenden.

CloseMainWindow sendet eine Schließenachricht an das Hauptfenster des Prozesses. Dies ist die elegante Möglichkeit, einen Prozess mit einer Benutzeroberfläche zu stoppen.

2

Lassen Sie mich veranschaulichen, was passiert, wenn Sie rufen Sie Close() und Kill(). Das Folgende öffnet den Editor, beendet den Editor jedoch nicht am Ende, wenn myProcess.Close() ausgeführt wird.

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

das folgende wird Notepad öffnen. Nach 10 Sekunden wird der Notizblock am Ende geschlossen, wenn myProcess.Kill() ausgeführt wird.

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Kill(); 
Verwandte Themen