Что на самом деле означает Process.Responding? - PullRequest
9 голосов
/ 21 июля 2011

Я призываю выполнить некоторую работу, и одно из требований - убить процесс, если он завис.
Моей первой мыслью было «Процесс. Отвечая», однако я не уверен, что это на самом деле означает.

Это то же самое, что когда Win7 добавляет (Not Responding) к заголовку окна приложения?На моей машине это происходит, даже когда MS Word пытается открыть файл с очень медленного удаленного общего ресурса.

Каковы условия для того, чтобы Process.Responding был ложным?

Ответы [ 3 ]

16 голосов
/ 21 июля 2011

При проверке свойства 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;
}
4 голосов
/ 21 июля 2011

Responding означает, что окно приложения отвечает пользователю. процесс должен иметь MainWindowHandle от msdn :

true, если пользовательский интерфейс связанного процесса отвечает системе; в противном случае - ложь.

Если у процесса нет MainWindowHandle, это свойство возвращает true.

Вы можете изменить время ожидания, используемое приложением. Ответная проверка this .

3 голосов
/ 21 июля 2011

С http://msdn.microsoft.com/en-us/library/system.diagnostics.process.responding.aspx

Если процесс имеет пользовательский интерфейс, свойство Responding связывается с пользовательским интерфейсом, чтобы определить, отвечает ли процесс на пользовательский ввод. Если интерфейс не отвечает немедленно, свойство Responding возвращает false. Используйте это свойство, чтобы определить, перестал ли интерфейс связанного процесса отвечать.

...