2011-03-11 94 views
1

好日子,如何檢查給定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

回答

2

的解決方案是使用屬性HasExited

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

[email protected] 

這是我搜索了。

2

試試這個代碼片斷

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

相關問題