2010-08-17 31 views
12

有沒有可能從代碼檢查另一個進程是否沒有響應?如何檢查進程是否無響應?

問題是即使應用程序崩潰並且管理器列表中標記爲'Not Responding',Process.Responding屬性仍然返回'true'。

'已退出'事件和函數'WaitForExit'在進程是 - 清除任何操作時執行任何操作。所以這不是重點。

問題用兩個字;我需要知道應用程序崩潰。如何從代碼中檢查它?

謝謝你的時間。

+1

其他進程是否有(可見的)主窗口?這是'Process.Responding'所必需的,請參閱http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx – 2010-08-17 08:37:24

+0

我的應用程序需要檢查用戶定義的其他進程運行時間。所以我不知道它是否是例如控制檯應用程序。 – futurlo 2010-08-17 09:28:35

+3

除了任務管理器GUI應用啓發式(IIRC:它是否及時處理WN_NULL消息)之外,沒有確定「掛起」的一般方法(例如,它可能正在等待某事或忙於工作)。 – Richard 2010-08-17 09:31:35

回答

19

這個問題沒有通用的解決方案。

由於術語「掛起」完全取決於正在執行的過程的上下文,因此無法確定某個特定過程是否掛起。

懸掛過程將始終執行它被編碼的操作。開發人員可能對它進行了嚴格的編碼,但Windows無法假設什麼是對/錯。

可能想法設法可能是:

  1. Process.Responding通話將指示是否正在執行Windows消息循環響應的過程。

  2. 對於更一般的情況,一種可能的解決方案可能是間隔輪詢該進程的內存使用情況,並且如果它在足夠的時間之後沒有改變,則認爲它是掛起的。你可以用Process.WorkingSet64來做到這一點。但是,我預計這會導致一些誤報 - 不處理任何事情的穩定流程似乎是懸而未決的。如果發生內存泄漏的掛起進程似乎正在做一些有用的事情,那麼實際上它會陷入循環,這也會導致錯誤的否定。

  3. 如果進程寫入StandardError的/ StandardOutput流(如許多控制檯應用程序做的),那麼你可以嘗試聆聽這樣的輸出:Process.BeginOutputReadLineProcess.BeginErrorReadLine。如果在給定的時間內沒有這樣的輸出,你可能會推斷它已經掛起。

但是你不會在一般情況下找到任何有用的東西。

相關問題