首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何识别一个反应迟钝的过程?

如何识别一个反应迟钝的过程?
EN

Stack Overflow用户
提问于 2016-02-10 12:20:17
回答 1查看 1.7K关注 0票数 1

我正在为部署在Windows 2008 R2和Windows 2012环境中的客户端重构自定义进程监视应用程序。

监视应用程序需要识别崩溃的、没有响应的进程(在任务管理器中被标识为“未响应”),强行杀死它们并重新启动。监控的进程可以是控制台,也可以是基于can 32的应用程序,主要是基于控制台的。

在这种特殊情况下,Process.Responding属性没有任何用处,因为它确定UI是否正在响应(可能使用类似于下面更新此属性的“幕后”方法)。

如果IsHungAppWindow方法是导入的,因为基于控制台的应用程序不符合以下条件,那么它也没有用:

如果应用程序没有等待输入,没有启动处理,并且没有在5秒的内部超时时间内调用PeekMessage,则该应用程序被视为没有响应。

如果I使用WMI系统类监视进程,则Win32_Process WMI类的Win32_Process属性是无用的,因为:

此属性未实现,也不为该类的任何实例填充。它总是空的。

WMI类的ExecutionState属性没有任何用处,因为它似乎也没有实现。虽然没有明确声明,但在运行本地测试之后,它会反复返回NULL第三人表示这一点。

如何合理地确定流程是否没有响应?

EN

回答 1

Stack Overflow用户

发布于 2016-02-10 12:20:17

我可以确定的最佳答案和解决方案是从中监视Application ErrorApplication Hang事件。

从.NET 3.5开始,实现了一个方便的类,以避免读取和过滤整个事件日志:EventLogWatcher允许监视特定的事件。

下面是一个非常基本的示例,由EventIDLevelApplicationName使用XPath查询进行过滤:

代码语言:javascript
复制
using System.Globalization;
using System.Diagnostics.Eventing.Reader;

EventLogQuery filter = new EventLogQuery("Application", PathType.LogName, "Event[System[Level=2 and (EventID = 1000 or EventID = 1002)] and EventData[Data[1] = \"example.exe\"]]")
EventLogWatcher watcher = new EventLogWatcher(filter);

watcher.EventRecordWritten += Watcher_ApplicationError; // Register our handler
watcher.Enabled = true; // Start delivering events to the handler

private void Watcher_ApplicationError(object sender, EventRecordWrittenEventArgs e) 
{
     String rawId = e.EventRecord.Properties[8].Value.ToString(); // Faulting process id

     Int32 id = -1;
     if (!Int32.TryParse(rawId, out id)) // If not integer, possibly hexadecimal
     {
         if (!Int32.TryParse(rawId, NumberStyles.HexNumber, CultureInfo.InvariantCulture, out id)
             return; // Unable to read the process id successfully
     }

     Process unresponsive = Process.GetProcessById(id); // Get the unresponsive process
     unresponsive.Kill(); // Kill it
}

这可以很容易地通过完全合格的、错误的应用程序执行路径Properties[10]进行过滤。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35315144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档