如何确定进程ID是否存在

18

我正在使用C# .NET 2.0。我需要确定一个PID是否存在。我编写了以下代码:

private bool ProcessExists(int iProcessID)
{
    foreach (Process p in Process.GetProcesses())
    {
        if (p.Id == iProcessID)
        {
            return true;
        }
    }
    return false;
}

除了遍历所有进程,还有更好的方法吗?

3个回答

27

快速提醒:你永远无法确定除了自己的进程之外是否在运行。你只能知道它在最近过去的某个时间点上运行过。一个进程可以在任何时刻,包括你检查它是否具有匹配ID的确切时刻,简单地停止存在。

话虽如此,这种确定方式可能或可能不足以满足你程序的要求。这取决于你想做什么。

以下是您编写的代码的简短版本。

private bool ProcessExists(int id) {
  return Process.GetProcesses().Any(x => x.Id == id);
}

10

这里的风险在于:你从哪里获取了该进程 ID?如果它只是你之前保存的一个数字,原始进程可能已经停止,新的进程可能正在使用相同的 ID 运行

你想要实现什么?可能有更好的方法来实现你的实际目标。


PID是可靠的。它是启动我的应用程序的第二个应用程序的PID。第二个应用程序保证在我的应用程序运行时始终运行。(我的应用程序本质上是一个具有第二个应用程序作为其父级的DialogBox。)除此之外,为了这个问题而涉及到的细节并不值得深入讨论。谢谢。 - Ken
但是你的问题是关于确定它是否正在运行。如果它保证在运行,为什么还要检查呢? - Eric J.
好的观点。这是一个理智检查,以防万一特殊情况确实发生,原因超出我的掌控范围。我会编辑问题文本,以更好地表达示例代码的实际含义。谢谢。 - Ken

6

System.Diagnostics.Process.GetProcessById(iProcessID)如果进程不存在,将会抛出ArgumentException异常。虽然这不是检查进程是否存在的最佳方式,但希望这正是您要寻找的。


谢谢建议,但我通常不赞成在尝试解析某个值时捕获异常,这是标准实践。 - Ken
我同意,但是希望这正是您的程序所需要的,我想不出检查特定进程 ID 是否存活的原因。 - Yuriy Faktorovich

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接