2012-12-26 72 views
10

我已經在一個月前安裝了Windows 8,並且在進程掛起時一直存在問題,我無法結束/殺死它。任務管理器和CMD Taskkill/f/PID ####都不能完成這項工作,所以我想我會用C#編寫我自己的進程殺手,看看出現了什麼問題。殺死進程(Windows 8)的問題

在寫了一個小應用程序後,我意識到我並不像我想的那麼聰明 - 我仍然無法結束這個過程。起初我能找到的名字過程/ PID:

Process p = Process.GetProcessById(aPid) 
//or 
foreach (Process p in Process.GetProcessesByName(aProcessName) 

..和漸漸當我試圖「拒絕訪問」異常:

process.Kill(); 

..after嘗試幾次說改變了,我將無法再找到這個過程。例如。當我試圖通過名稱或PID找到它時,沒有返回任何內容,而該過程仍保留在任務管理器和我的屏幕上。

我也看到了有關過程@MSDN和它說「拒絕訪問」,可以拋出,如果該進程已經終止或無法終止.. :(

幫助?難道真的沒有辦法強制結束進程?

+0

你試過powershell stop-process嗎? – tschmit007

回答

11

那麼,你基本上遇到了同樣的問題,阻止任務管理器終止進程。有兩個可能的原因:一個與訪問被拒絕的異常相關聯,該進程可能已經刪除了訪問因爲你在Windows 8上運行,所以你已經安裝了.NET 4.5,它爲Process類提供了一個新的方法,你可以調用EnterDebugMode()。這使SeDebugPrivilege,可能足以現在使Kill()工作。

另一個是一個更大的問題,該進程可能有一個線程在內核模式下處於活動狀態,而不是正在退出。最好的診斷方法是使用「任務管理器」,「詳細信息」選項卡,右鍵單擊列標題之一併選擇「選擇列」。勾選「手柄」。查看過程的顯示值。如果您看到一個非零值,那麼進程很可能會打開一個句柄,並等待設備驅動程序執行I/O請求。並且該設備驅動程序不會對Windows要求它取消該請求。縮小麻煩製造者並不是那麼容易,你必須更多地瞭解你的流程執行哪種I/O請求。通過在superuser.com上詢問關於它的問題來進行跟進。