【问题标题】:Is there a way to find a process on top of the process id and name in c#有没有办法在c#中的进程ID和名称之上找到一个进程
【发布时间】:2019-08-29 15:41:09
【问题描述】:

我启动了多个流程,我想跟踪每个流程,以便在流程在我不知情的情况下结束时重新启动。

目前,我将进程 ID 存储在我的数据库中,并使用进程 ID 和名称来检查进程是否仍在运行。

Process process=Process.GetProcessById(id);
if(process.ProcessName==processName){
 //kill the process
}

但是,我在网上读到,当一个进程死亡时,它的 id 将免费供其他进程使用。可能会有一个带有我旧进程 ID 和名称的新进程,这可能导致我假设我的旧进程仍在运行。

我可以添加任何其他字段来使我的流程独一无二吗?比如工艺现场?我无法获得有关流程站点用途的更多信息。

【问题讨论】:

  • 如果 processID 是您要查找的进程 ID,而进程名称是您要查找的进程名称....那么您应该很好。
  • 请允许我澄清一下您对此有何了解或不了解:您是否知道您无法在技术上启动(或重新启动)流程结束后?您可以使用相同的参数启动 new 进程,但它将是具有不同进程 ID 的新进程。您还知道在 Windows 中您可以打开进程的 HANDLE,即使在进程退出后它仍然有效?

标签: c# process


【解决方案1】:

除了 ID 之外,您还可以存储 Process.StartTime 属性。这应该可以在 PID 被重复使用的情况下保护您,因为新进程的开始时间与存储的开始时间不同。

var process = Process.GetProcessById(id);

if (process.ProcessName == processName && process.StartTime == startTime)
{
    //kill the process
}

我怀疑以下内容不适用,因为您正在持久化进程信息,但如果您的应用程序持续监控这些进程,那么您可以考虑使用Process.Exited 事件在进程退出时接收通知,而不是每隔一段时间检查一次,例如

process.EnableRaisingEvents = true;
process.Exited += (sender, args) => { /* Do something */ };

【讨论】:

  • 很好的解决方案!!
  • 谢谢!这就是我需要的:)
【解决方案2】:

运行这段代码并查看

的可用属性
runningProcesses

...

    private static void KillProcess(string processName)
    {
        Process[] runningProcesses = Process.GetProcesses();
        foreach (Process process in runningProcesses)
        {
            if (process.ProcessName == processName)
            {
                process.Kill();
            }
        }
    }

您可以使用独特的 BasePriority 创建您的流程 或类似的东西。

Documentation

【讨论】:

    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2012-10-17
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多