2012-12-19 172 views
48

當我開始一個過程並想關閉此過程時,Process.Close()Process.Kill()之間有什麼區別?殺死進程和關閉進程有什麼區別?

我問,因爲我有一個應用程序開始捕捉包使用Wireshark命令通過命令行與Windows = hidden。 所以當我想停止捕獲我殺死進程。所以有時捕獲打開一個錯誤,最後一個數據包被中斷,所以我想知道可以使用close()之前kill()將解決這個問題?

當我開始捕獲時,我可以通過按Ctrl + C關閉它,但在我的情況下,我打開隱藏狀態的窗口,我可以通過我的代碼做類似的事情嗎?

+2

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

回答

50

什麼是Process.Close()process.Kill()之間的區別是什麼?

該手冊是相當清楚的是:

Process.Close()

Close方法使進程停止等待退出,如果它在等待,關閉進程句柄,並清除過程特定屬性。關閉不會關閉標準輸出,輸入和錯誤讀取器和寫入器,以防外部引用它們。 [即

殺迫使過程的結束,而僅僅CloseMainWindow請求終止:本身保持運行的過程中,你就不能忍受了使用Process實例]

Process.Kill()控制。 [...]通過調用CloseMainWindow退出進程的請求不會強制應用程序退出。應用程序可以在退出前要求用戶驗證,否則可能會拒絕退出。要強制退出應用程序,請使用Kill方法。 CloseMainWindow的行爲與使用系統菜單關閉應用程序主窗口的用戶的行爲相同。因此,通過關閉主窗口退出進程的請求不會強制應用程序立即退出。

Process.CloseMainWindow

關閉具有通過發送關閉消息到它的主窗口的用戶界面的方法。


至於你的編輯:

我問,因爲我有申請誰開始通過與Windows =隱藏命令行中使用Wireshark的使用命令來捕獲數據包。

Use the WinPcap APIPcap.Net library for that,而不是Wireshark。

+0

當我開始捕捉時,我可以通過按Ctrl + C關閉它,但在我的情況下,我打開隱藏狀態的窗口,我可以做些什麼嗎? – user1710944

+0

@ user1710944我不理解您的評論,但您應該仔細研究WinPcap API。在隱藏窗口中運行程序並不是真正推薦使用它們的邏輯和數據的方式,這就是API的用途。 – CodeCaster

10

Kill詢問系統以毫不客氣地終止進程(通過對Windows TerminateProcess系統調用的調用)。這類似於任務管理器中的結束進程。

Close關閉.NET中進程的句柄,但實際上並沒有觸及進程本身。 Close也被稱爲Dispose。見Jon Skeet的this answer

第三個選項是CloseMainWindow,其中確實通過詢問主窗口關閉來正常關閉程序。這類似於右鍵單擊任務欄上的程序並選擇關閉。

+0

當然,如果該應用程序安裝時終止CloseMainWindow只會終止應用程序其主窗口關閉。 –

4

殺死和關閉不是兩個選項。如果要終止進程,則必須調用Kill(或CloseMainWindow)。調用關閉只會釋放資源,但不會關閉標準流。自己關閉流可能會或可能不會導致流程結束,這取決於流程。最好的策略是根據進程的類型調用Kill或CloseMainWindow,然後處理Process對象。

Close開始關閉Process對象。它由Dispose調用。關閉通常用於管理Process對象的資源。

Kill終止該過程。這是終止沒有用戶界面的進程的唯一方法。

CloseMainWindow發送關閉消息到進程的主窗口。這是停止具有用戶界面的流程的優雅方式。

2

讓我來舉例說明當您致電Close()和Kill()時,會發生什麼情況。以下操作將打開記事本,但在執行myProcess.Close()時不會在最後退出記事本。

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

以下將打開記事本。 10秒鐘後,當執行myProcess.Kill()時,記事本將在最後關閉。

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