2010-09-20 60 views
1

基於other questions,我使用的System.Diagnostics.ProcessStartKill的方法:的處理被拒絕死

this.childProcess.Kill(); 
this.childProcess.WaitForExit(); 
this.childProcess.Close(); 

我將承擔與Kill命令的異步特性即WaitForExit交易,然而該過程問題(perl.exe)拒絕死亡。相反,它會持續一段時間。

這段「時間段」正在引起競爭狀態。無論如何,我可以確保這個過程實際上死亡?

+0

這是一個XY問題。 Y是「爲什麼我不能殺死這個過程」。 X是「我爲什麼編寫代碼來首先殺死進程」。我不得不推薦追求X. – 2010-09-20 23:31:33

+0

@Hans我想知道爲什麼一個流程不會死亡是分析我的項目中的數據流的一個有用的步驟。我可以重寫我的項目的大部分內容,假定只有在重新引入相同問題時才能殺死進程。 – tzenes 2010-09-20 23:35:15

+0

嗯,我試過了。祝你好運。 – 2010-09-20 23:47:35

回答

3

我不確定您的意思是「確保此過程實際上已經死亡」。在引擎蓋下,Kill方法最終調用TerminateProcess,這是殺死進程的最有效方法,並且只有在進程實際上消失之後,纔會返回WaitForExit

Kill方法可能無法真正殺死至少2個的情況下的過程

  1. 您沒有足夠的權限來殺死進程
  2. 有附加到進程調試器(我相信這可以防止TerminateProcess工作)。
  3. 不間斷I/O操作(感謝丹尼爾)

執行下列任一這些適用於您的情況?

+0

我相信我有足夠的權利,因爲:a)我產生了它,b)它「有時」死亡。如果我在父進程上運行調試器,或者我根本沒有調試器,則會遇到問題。 – tzenes 2010-09-20 22:35:01

+1

還有另一種情況,一個進程不能死(至少暫時不會):如果它正在進行不可中斷的I/O操作。很有可能是所討論的perl.exe進程只是在執行某種文件或套接字I/O,甚至在調用TerminateProcess之後,操作系統仍然會等待未完成的I/O進行刷新。如果你有混合動力車司機,這可能不會發生。馬克Russinovich了[博客文章覆蓋此](http://blogs.technet.com/b/markrussinovich/archive/2005/08/17/unkillable-processes.aspx),這可能是有用的。 – 2010-09-20 22:45:13

+1

@Daniel如果它正在做某種不間斷的I/O(比如說寫入磁盤),我怎麼知道它何時實際完成? – tzenes 2010-09-20 22:59:59

相關問題