【问题标题】:Correct approach to check if a list of processes are running检查进程列表是否正在运行的正确方法
【发布时间】:2021-11-02 21:30:45
【问题描述】:

我正在使用 C# 编写一个应用程序,以便用户记录他们对程序的使用时间。他们可以选择进程并将它们存储在数据库中。

该应用当前正在使用一个以 5 秒为间隔的计时器,以使用 Diagnostics.Process.GetProcesses() 循环遍历设备上每个正在运行的进程,并将此名称列表与数据库中的名称进行核对。

这是一个合理的方法吗?或者最好为数据库中的每个进程创建一个线程来监听它以开始使用Win32Process.ProcessInfo.StartedEventHandler()

【问题讨论】:

  • 如果它可以工作,并且可以很好地满足您的需求,那么问题出在哪里?我们是工程师,没有完美的解决方案。
  • 您的要求是什么?以满足您的要求的方式实施它
  • 顺便说一句:运行一个 EXE != 使用它。我的电脑运行了超过 200 个 EXE,我觉得我只使用 Firefox。我不知道其他人都在做什么。
  • 每个条目运行一个线程绝对是矫枉过正。如果我在数据库中有 1000 个条目怎么办?你会运行 1000 个线程吗?这将导致卸载或错误报告
  • 是的,经过考虑,我现在会坚持使用计时器,因为每个条目一个线程似乎有点多。我担心的是,当应用程序在后台运行时,它可能会使用比它必须使用的更多资源,但我想我必须更多地开发应用程序才能以这种特定方式测试其性能。感谢您的帮助!

标签: c# winforms


【解决方案1】:

任何时候可以避免轮询,都应该这样做。

启动时,您需要枚举进程以获取当前系统状态。在此之后,您可以使用 WMI 监控进程创建: Is there a System event when processes are created?。您甚至可以修改该查询以仅包含您关心的进程。

每当您获得匹配项(在启动时或 WMI 事件时),使用 Diagnostics.process.GetProcesses() 调用,并将事件处理程序附加到 Process.Exeted 事件:https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.exited?view=net-5.0 以了解它何时关闭。

【讨论】:

  • 我需要通过 WMI 创建进程,从那里我可以使用数据库中的名称进行查询。谢谢!
猜你喜欢
  • 2015-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-11
  • 2015-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多