【问题标题】:How to check if a process is suspended? - Not not responding如何检查进程是否被挂起? - 没有不回应
【发布时间】:2017-11-01 13:22:44
【问题描述】:

我正在编写一个 C# 控制台应用程序来查找是否有任何挂起的 OUTLOOK 进程。有时,在我们的终端服务器上,Outlook 会锁定会话并在任务管理器中卡住为“暂停”。

我在一个网站上找到此代码作为检查记事本进程是否暂停的示例:

var proc = Process.GetProcessesByName("notepad");
var isSuspended = proc[0].Threads[0].ThreadState == ThreadState.Suspended; 

我尝试了这个确切的代码,但唯一可能的 ThreadStates 是:

- Initalized
- Ready
- Running
- Standby
- Terminated
- Transition
- Unknown
- Wait. 

据我所知,没有“暂停”。是否有替代方法来检查挂起的进程?

【问题讨论】:

  • 当 UI 线程被阻塞时发生。你必须找到 ui 线程。
  • @ArtavazdBalayan 我也这么认为,但我看不到。 imglnk.uk/img?i=CTcfpo.png
  • 这不是重复的!建议的问题不是关于暂停的进程,而是关于不响应的进程,这是不同的。一个进程可以被挂起而不是不响应。
  • 感谢您在不检查的情况下将其标记为重复。我讨厌不得不向同一个问题发送垃圾邮件。

标签: c#


【解决方案1】:

通过ThreadState 确定线程正在等待,您可以检查ProcessThreadWaitReason 属性并查看那个 是否表明它是@ 987654322@.

显然,执行此类测试存在时间问题,因为其他过程不在您的控制范围内。

【讨论】:

  • 我确实发现 99% 的进程都说“Wait”,我现在添加了 WaitReason,它们都说“UserRequest”。不过,我还没有用实际的暂停进程进行测试。
  • @user2924019 - 请记住,您可能需要检查多个线程。我不确定任务管理器通过哪种逻辑显示“暂停”,因为正如我们所讨论的,它是一个 thread 属性,而不是 process 属性。可能是“至少一个线程被挂起”或“所有线程都被挂起”。
  • 我刚刚在一个挂起的线程上进行了测试,应用程序崩溃了,因为参数超出了该挂起线程的范围。 ThreadState 实际上已暂停,但我的应用程序不理解这一点。
  • 我用这种方法检查ThreadState是否为'Wait',如果是,则检查WaitReason是否为“Suspended”。
  • 可以使用ProcessExplorer进行调试,在感兴趣的进程的Threads页面,线程状态显示在底部Wait: Suspended。挂起的进程已挂起所有线程。
猜你喜欢
  • 2011-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多