2009-12-04 59 views
0

我通过Process class从C#app启动了一些批处理文件。此文件启动了Java应用程序。我无法识别哪个进程称为java.exe必须杀死以停止此应用程序。有没有比杀死所有更优雅的方式,希望我结束了正确的,并不杀死其他重要的Java应用程序?感谢任何帮助,我真的坚持在那里。查杀java.exe进程

干杯, 安德鲁

+0

应该有一个OS维护的Java.app和C#应用程序之间的父子关系。我假设你在窗户上?为什么你想要杀死这个Java进程? – 2009-12-04 13:57:44

+0

是在窗户上的Iam。 Java进程由用户从我的C#应用​​程序启动。它为他做了一些计算。如果用户决定停止计算,我必须杀死Java应用程序,因为它处理大量的数据,因此时间昂贵。谢谢。我发现一些维护亲子关系,我会测试它。 – Andrew 2009-12-05 00:41:09

回答

2

编辑:我错过了批处理文件的一部分。如果您可以直接从C#启动进程,此答案只会有用...

当您启动进程时,您可以存储进程ID,以便稍后获取进程并将其终止。

Process p = new Process(); 
//set all the process start Info... 
p.Start(); 

someVariableICanGetToLater = p.Id 

//Later when you need to kill the process... 
Process pToKill = Process.GetProcessById(someVariableICanGetToLater); 
pToKill.Kill(); 
+0

看来他并不知道Java进程正在启动,所以我怀疑他知道代码在哪里,或者源代码不可用。 – 2009-12-04 13:58:52

0

我假设,由于批处理文件启动了Java应用程序,因此知道批处理文件进程的ID将无济于事。

Process.GetProcessesByName("java")为您提供了所有java.exe实例的列表。

+0

加上他需要查询C#应用程序和java进程之间的父子关系。你可以发布该代码吗? :P – 2009-12-04 14:00:14

0

伪代码。在这里填写OS特定呼叫:

int cs_pid=getProcessByName("CSharpAppName"); 
int javaPid[]= getProcessByName("JavaAppName"); 

bool javaToCSharpRelationship[]=new bool[javaPid.size]; 

int loopCounter=0; 

forEach int in javaPid 
begin 
     if(isChildOf(cs_pid,java_pid)) 
     begin 
     // OS call or Wrapper to determine relationship between c# pid 
     // and Java app PID 
     javaToCSharpRelationShip[loopCounter]=true; 
     //can call kill here if you like 
     end 
     else 
     javaToCSharpRelationShip[loopCounter]=false; 
    loopCounter++; 
end 

这段代码的最后,你应该有PID的这是C#应用程序的儿童组成的数组。

+0

嗨,那看起来很有趣。你能给我一些提示isChildOf方法吗? – Andrew 2009-12-04 15:11:21

0

除非该批处理文件做很多事情,很难只用.NET的ProcessProcessStartInfo类来实现,另一种选择是直接开始的java.exe和控制通过ProcessStartInfoArgumentsEnvironmentVariables性能参数和环境变量。

然后,您可以使用Jason的方法来存储java.exe进程的ID,以便稍后杀死它。