我正在脫身做一些工作,其中一項要求是如果掛起的話會終止進程。
我的第一個想法是Process.Responding,但是,我不確定它的真正含義。Process.Responding是什麼意思?
與Win7在應用程序的窗口標題中添加(Not Responding)
是否一樣?在我的機器上,即使MS Word試圖從一個非常慢的遠程共享中打開文件,也會發生這種情況。
讓Process.Responding成爲false是什麼條件?
我正在脫身做一些工作,其中一項要求是如果掛起的話會終止進程。
我的第一個想法是Process.Responding,但是,我不確定它的真正含義。Process.Responding是什麼意思?
與Win7在應用程序的窗口標題中添加(Not Responding)
是否一樣?在我的機器上,即使MS Word試圖從一個非常慢的遠程共享中打開文件,也會發生這種情況。
讓Process.Responding成爲false是什麼條件?
在引擎蓋下,當您檢查Process.Responding
屬性時,將調用Windows功能SendMessageTimeout
。
此功能基本上將消息發送到另一個進程,並檢查該窗口是否被接受的5000毫秒(因此檢查上一個控制檯應用該屬性沒有作用)在超時內的消息的主窗口。
如果你想使用自定義超時你可以和自己調用SendMessageTimeout
功能:
[DllImport("user32.dll", CharSet=CharSet.Auto)]
public static extern IntPtr SendMessageTimeout(
HandleRef hWnd,
int msg,
IntPtr wParam,
IntPtr lParam,
int flags,
int timeout,
out IntPtr pdwResult);
const int SMTO_ABORTIFHUNG = 2;
public bool RespondingWithinMs(Process process, int timeoutMs)
{
IntPtr ptr2;
return SendMessageTimeout(
new HandleRef(process, process.MainWindowHandle),
0,
IntPtr.Zero,
IntPtr.Zero,
SMTO_ABORTIFHUNG,
timeoutMs,
out ptr2) != IntPtr.Zero;
}
[Process.Responding源(https://referencesource.microsoft.com/#System/services/monitoring/system/diagnosticts/Process.cs,953):注意他們在5000毫秒傳遞超時明確。對於SendMessageTimeout [這裏](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644952(V = vs.85)的.aspx)的MSDN頁面有更多的信息比你的MSDN鏈接,這一個明確了「此功能認爲,一個線程不響應,如果它不叫的GetMessage或五秒鐘之內類似的功能」 - 我認爲這不僅影響了'SMTO_ABORTIFHUNG'標誌,這是一個不同的,硬編碼5秒檢查。 – Quantic
從http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx
如果一個進程具有用戶界面,所述響應性接觸用戶界面,以確定該過程是否正在響應用戶輸入。如果接口不立即響應,則Responding屬性返回false。使用此屬性可確定關聯進程的接口是否已停止響應。
這正是它說:這一直是那些真正來自非用戶友好的消息之一從技術實現細節:消息循環沒有響應。 – sehe