【问题标题】:Detect when specific program program has closed with C#检测特定程序程序何时用 C# 关闭
【发布时间】:2017-08-10 20:06:42
【问题描述】:

我在同一台机器上运行了两个不同的 .jar 程序。我希望能够检测其中一个何时关闭或不再运行。

运行此代码时,我遇到的这个问题是:

  var allProc = Process.GetProcesses();
  foreach (var p in allProc)

  comboBox1.Items.Add(p.ProcessName);
  comboBox1.Sorted = true;

它只显示一个正在运行的 Java 实例,而且它不仅没有显示任何一个进程名称。

我要监控的程序使用大量 RAM,所以我考虑监控 RAM 使用情况并在它低于某个水平时执行我需要的操作,但对我来说,这听起来像是一种 hacky 方式和其他因素可以影响它。

有什么想法吗?

【问题讨论】:

    标签: java c# process


    【解决方案1】:

    您可以使用System.Diagnostics.Process 获取您要查找的父进程的进程 ID

    然后您可以从那里通过 (System.Management) 命名空间使用 WMI 来搜索子进程:

    Process[] javaProcesses = Process.GetProcessesByName("somejavaapp.exe");
    foreach (Process proc in javaProcesses)
    {
        ManagementObjectSearcher searcher = new ManagementObjectSearcher(
        "SELECT * " +
        "FROM Win32_Process " +
        "WHERE ParentProcessId=" + proc.Id);
    
        ManagementObjectCollection collection = searcher.Get();
    
        // Choose what to do with the child processes.
        foreach (var childProcess in collection)
        {
            var childProcessId = (UInt32)childProcess["ProcessId"];
        }
    }
    

    【讨论】:

      【解决方案2】:

      前段时间我遇到了同样的问题,对我来说最好的解决方案是运行 java 程序作为孩子。

      例子

        server = new Process();
        server.StartInfo.FileName = "java";
        server.StartInfo.Arguments = "-Xmx4000M -jar forge.jar nogui";
        server.Start();
      

      然后简单

        status = server.HasExited;
      

      【讨论】:

        【解决方案3】:

        JDK 附带了一个名为jps 的命令行工具。 jps -v 显示您传递给 java 的所有参数。它提供以下输出:

        lvmid [ [ classname | JARfilename | "Unknown"] [ arg* ] [ jvmarg* ] ]

        你可以从c#调用jps,然后读取输出。

        【讨论】:

          猜你喜欢
          • 2012-05-10
          • 2019-03-27
          • 1970-01-01
          • 1970-01-01
          • 2023-03-09
          • 1970-01-01
          • 1970-01-01
          • 2018-06-11
          • 1970-01-01
          相关资源
          最近更新 更多