使用C#检测特定程序程序何时关闭

时间:2017-08-10 20:06:43

标签: java c# process

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

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

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

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

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

我想要监控的程序使用了大量的RAM,所以我考虑监控RAM的使用情况并在达到一定水平时做我需要的东西,但对我来说这听起来像是一种黑客的做法和其他因素可以影响它。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您可以使用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"];
    }
}

答案 1 :(得分:2)

前一段时间我有同样的问题,对我来说最好的解决方案是将java Programm作为孩子运行。

实施例

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

然后简单

  status = server.HasExited;

答案 2 :(得分:1)

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

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

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