如何检查给定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的进程是否仍然存在?这个功能的定义可能应该在流程仍然存在的时候完成。稍后我只想检查它是否仍然存在。
的解决方案是使用属性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());
}
@Øyvind如果进程不存在,* Mathematica *中的这种方法会给出“.NET异常”错误。它确实给出了答案,但这不是一个好的方法...我需要一个''''函数,它只是返回类似'True'或'False'的东西。第二个问题是我希望检查先前存在的流程的存在,而不仅仅是检查是否有另一个具有相同ID的流程。 – 2011-03-11 07:10:32
我现在将它改为一种方法,根据进程是否存在返回true。如果这是你杀死的同一个进程,或者一个拥有相同ID的新进程很难检查。你可以做的一件事是存储你杀死的ID的进程名称和ID,然后在检查时查看ID和名称是否匹配。具有相同名称的新流程获得相同的ID将不太可能,因此它应该足够好。 – 2011-03-11 07:20:48
哦,我刚刚找到我需要的东西!它是属性'HasExited':** proc = Process'GetProcessById [id]; proc @ HasExited **。谢谢你以任何方式! – 2011-03-11 07:29:32
进程ID可以重复使用。你怎么知道进程ID'x'的进程现在是否与上次查找进程时的进程相同? – 2011-03-11 07:16:40
@Damien_The_Unbeliever这是问题所在。但似乎我找到了解决办法。它是属性'HasExited':** proc = Process'GetProcessById [id]; PROC @ HasExited **。 – 2011-03-11 07:33:00