2012-12-19 12 views
48

Quando si avvia un processo e si desidera chiudere questo processo, quali sono le differenze tra Process.Close() e Process.Kill()?Quali sono le differenze tra il processo kill e il processo close?

Ho chiesto perché ho un'applicazione che inizia a catturare pacchetti usando Wireshark con un comando via linea di comando con Windows = hidden. così quando voglio fermare la cattura mi uccidere il processo .Quindi volte la cattura si apre con un errore che l'ultimo pacchetto è stato tagliato a metà in modo da sto domandandomi lattina utilizzando close() prima kill() risolverà questo problema?

Quando inizio cattura posso chiuderlo premendo Ctrl + C, ma nel mio caso ho aperto la finestra in stato nascosto, posso fare qualcosa di simile con il mio codice?

+2

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

risposta

50

Quali sono le differenze tra Process.Close() e process.Kill()?

Il manuale è abbastanza chiaro che:

Process.Close():

Il metodo Close provoca il processo di fermarsi in attesa di uscita se è stato in attesa, chiude l'handle di processo, e cancella processo proprietà specifiche. Chiudi non chiude l'output standard, l'input, i lettori di errori e i writer nel caso in cui vengano referenziati esternamente. [Cioè il processo stesso continua a funzionare, basta non può controllare più utilizzando l'istanza Process]

Process.Kill():

Uccidi impone una terminazione del processo, mentre CloseMainWindow richiede solo una terminazione. [...] La richiesta di uscire dal processo chiamando CloseMainWindow non forza l'uscita dell'applicazione. L'applicazione può richiedere la verifica dell'utente prima di uscire, oppure può rifiutarsi di uscire. Per forzare l'uscita dall'applicazione, utilizzare il metodo Kill. Il comportamento di CloseMainWindow è identico a quello di un utente che chiude la finestra principale di un'applicazione utilizzando il menu di sistema. Pertanto, la richiesta di uscire dal processo chiudendo la finestra principale non forza l'applicazione a uscire immediatamente.

Process.CloseMainWindow:

chiude un processo che ha un'interfaccia utente con l'invio di un messaggio di chiusura alla sua finestra principale.


Per quanto riguarda la tua modifica:

ho chiesto perché ho applicazioni che iniziano a catturare pacchetto utilizzando Wireshark con il comando tramite linea di comando con Windows = nascosto.

Use the WinPcap API o Pcap.Net library for that, non Wireshark.

+0

quando inizio la cattura posso chiuderlo premendo Ctrl + C ma nel mio caso sto aprendo la finestra in stato nascosto, posso fare qualcosa con questo? – user1710944

+0

@ user1710944 Non capisco il tuo commento, ma dovresti davvero esaminare l'API di WinPcap. L'esecuzione di programmi in finestre nascoste non è proprio il modo consigliato di utilizzare la logica e i dati, ecco a cosa servono le API. – CodeCaster

10

Kill chiede al sistema per terminare il processo unceremoniously (tramite una chiamata alla chiamata di sistema di Windows TerminateProcess). Questo è simile al processo finale in Task Manager.

Close chiude la maniglia per il processo in NET, ma in realtà non toccare il processo stesso. Close viene anche chiamato da Dispose. Vedi this answer di Jon Skeet.

Una terza opzione è CloseMainWindow, che fa chiude correttamente il programma chiedendo la chiusura della finestra principale. Questo è come fare clic con il pulsante destro del mouse sulla barra delle applicazioni e scegliere Chiudi.

+0

Naturalmente CloseMainWindow sarà solo terminare l'applicazione se l'applicazione è configurato per terminare quando la sua finestra principale è chiusa. –

4

Kill e Close non sono due opzioni. Kill (o CloseMainWindow) deve essere chiamato se si desidera terminare un processo. Calling Close libererà solo le risorse, ma non chiuderà i flussi standard. La chiusura dei flussi può o non può causare la fine del processo, dipende dal processo. La strategia migliore consiste nel chiamare Kill o CloseMainWindow a seconda del tipo di processo e quindi Smaltire l'oggetto Process.

Close inizia la chiusura dell'oggetto Processo. È chiamato da Dispose. La chiusura viene generalmente utilizzata per la gestione delle risorse dell'oggetto Processo.

Kill termina il processo. Questo è l'unico modo per terminare un processo che non ha un'interfaccia utente.

CloseMainWindow invia un messaggio di chiusura alla finestra principale del processo. Questo è il modo elegante per interrompere un processo che ha un'interfaccia utente.

2

Lasciami illustrare cosa succede visivamente quando si chiama Close() e Kill(). Quanto segue aprirà Blocco note ma non esce dal blocco note alla fine quando myProcess.Close() viene eseguito.

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

Quanto segue aprirà il Blocco note. dopo 10 secondi il blocco note si chiuderà alla fine quando myProcess.Kill() viene eseguito.

Process myProcess; 
myProcess = Process.Start("Notepad.exe"); 
Thread.Sleep(10000); 
myProcess.Kill(); 
Problemi correlati