Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 过程。响应到底意味着什么?_C#_Winforms_.net 3.5 - Fatal编程技术网

C# 过程。响应到底意味着什么?

C# 过程。响应到底意味着什么?,c#,winforms,.net-3.5,C#,Winforms,.net 3.5,我正在进行一些工作,其中一个要求是在进程挂起时终止进程。 我的第一个想法是过程。然而,我不确定这到底意味着什么 这是否与Win7在应用程序的窗口标题中添加(无响应)时相同?在我的机器上,即使MS Word试图从速度非常慢的远程共享打开文件,也会发生这种情况 有一个进程的条件是什么?响应可能为false?响应表示应用程序窗口正在响应用户。该进程应该有一个MainWindowHandle,来自: 如果关联进程的用户界面正在响应系统,则为true;否则,错误 如果进程没有MainWindowHandl

我正在进行一些工作,其中一个要求是在进程挂起时终止进程。
我的第一个想法是过程。然而,我不确定这到底意味着什么

这是否与Win7在应用程序的窗口标题中添加
(无响应)
时相同?在我的机器上,即使MS Word试图从速度非常慢的远程共享打开文件,也会发生这种情况


有一个进程的条件是什么?响应可能为false?

响应
表示应用程序窗口正在响应用户。该进程应该有一个
MainWindowHandle
,来自:

如果关联进程的用户界面正在响应系统,则为true;否则,错误

如果进程没有MainWindowHandle,则此属性返回true

您可以修改应用程序使用的超时。响应检查。

来自

如果进程具有用户界面,则响应属性将联系用户界面以确定该进程是否响应用户输入。如果接口没有立即响应,则响应属性返回false。使用此属性确定关联进程的接口是否已停止响应


在引擎盖下,当您检查
Process.Responding
属性时,将调用Windows函数

此函数基本上向另一个进程的主窗口发送消息,并检查窗口是否在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;
}

这正是它所说的:这始终是一条真正来自技术实现细节的非用户友好消息:消息循环没有响应。注意:它们显式传递5000ms超时。SendMessageTimeout的MSDN页面包含的信息比您的MSDN链接更多,这一页澄清了“如果线程在五秒钟内没有调用GetMessage或类似函数,则此函数认为线程没有响应”——我假设这只影响
SMTO\u abortfhung
标志,这是一个不同的,硬编码的5秒检查。但是,对于已检查的流程应用程序或检查流程的应用程序,这是否存在一些性能问题?