如何检查给定ID的进程是否仍然存在?

如何检查给定ID的进程是否仍然存在?

问题描述:

好日子,如何检查给定ID的进程是否仍然存在?

我是新来.NET和我与NETLink包访问.NET通过钨数学。我需要定义一个返回信息的函数.NET,无论具有给定ID的进程是否仍然存在。

通过NETLink以限定.NET功能的典型方法如下:

Needs["NETLink`"]; 
LoadNETType["System.Diagnostics.Process"]; 
killProc[procID_] := (
    proc = Process`GetProcessById[procID]; 
    [email protected][] 
    ); 

上述代码定义杀死与ID procID过程中的功能killProc[procID]。如何定义一个函数,用于检查之前是否存在此ID的进程是否仍然存在?这个功能的定义可能应该在流程仍然存在的时候完成。稍后我只想检查它是否仍然存在。

+0

进程ID可以重复使用。你怎么知道进程ID'x'的进程现在是否与上次查找进程时的进程相同? – 2011-03-11 07:16:40

+0

@Damien_The_Unbeliever这是问题所在。但似乎我找到了解决办法。它是属性'HasExited':** proc = Process'GetProcessById [id]; PROC @ HasExited **。 – 2011-03-11 07:33:00

的解决方案是使用属性HasExited

Needs["NETLink`"]; 
LoadNETType["System.Diagnostics.Process"]; 
proc = Process`GetProcessById[procID]; 

[email protected] 

这是我搜索了。

试试这个代码片断

Process myProcess = Process.GetProcessById(processId); 
if(myProcess == null) 
{ 
    //does not exist 
} 
else 
{ 
    //process still exists 
} 

编辑

现在我仔细检查了,看来我错了。如果未找到进程,Process.GetProcessById不会返回null,它会给出Argument exception。您应该使用此代码段代替:

public void ProcessExists(int myProcessId) 
{ 
    return Process.GetProcesses().Where(p => p.Id == myProcessId).Any()); 
} 
+0

@Øyvind如果进程不存在,* Mathematica *中的这种方法会给出“.NET异常”错误。它确实给出了答案,但这不是一个好的方法...我需要一个''''函数,它只是返回类似'True'或'False'的东西。第二个问题是我希望检查先前存在的流程的存在,而不仅仅是检查是否有另一个具有相同ID的流程。 – 2011-03-11 07:10:32

+0

我现在将它改为一种方法,根据进程是否存在返回true。如果这是你杀死的同一个进程,或者一个拥有相同ID的新进程很难检查。你可以做的一件事是存储你杀死的ID的进程名称和ID,然后在检查时查看ID和名称是否匹配。具有相同名称的新流程获得相同的ID将不太可能,因此它应该足够好。 – 2011-03-11 07:20:48

+0

哦,我刚刚找到我需要的东西!它是属性'HasExited':** proc = Process'GetProcessById [id]; proc @ HasExited **。谢谢你以任何方式! – 2011-03-11 07:29:32