特定程序程序关闭时检测C#

问题描述:

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

,我有是,运行此代码时,此问题:

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

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

,仅显示了Java的单一实例上运行,不仅如此它不显示任何过程的名称。

我想监视的程序使用了大量的RAM,所以我想了解如何监视RAM使用情况并在低于某个级别时执行我所需要的操作,但对于我来说,这听起来像是一种冒险的方式因素可能会影响它。

任何想法?

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

从那里,你就可以使用WMI通过(System.Management)命名空间来寻找孩子的过程:

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"]; 
    } 
} 

我前一阵子有同样的问题,对我来说最好的解决办法是运行java程序作为孩子。

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

然后简单地

status = server.HasExited; 

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

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

您还可以从C#JPS,然后读取输出。