2013-09-21 51 views
0

如何在事件引發時捕獲進程ID?Catch Process.Exited id

Process pros = Process.Start(ProcessStartInfo); 
pros.EnableRaisingEvents = true; 
pros.Exited += pros_Exited; 

private void pros_Exited(object sender, EventArgs e) 
{ 
    int processId = ?? 
} 

回答

3

您可以使用匿名函數捕獲的Process變量:

Process pros = Process.Start(processStartInfo); 
pros.EnableRaisingEvents = true; 
pros.Exited += (object sender, EventArgs e) => 
{ 
    int processId = pros.Id; 
    // ... 
}; 

編輯:如果您打算使用上面的符號在一個循環中,請確保您瞭解closures

foreach (Process process in myProcesses) 
{ 
    process.EnableRaisingEvents = true; 
    Process processInner = process; // copy to inner variable 
    processInner.Exited += (object sender, EventArgs e) => 
    { 
     int processId = processInner.Id; // always reference inner variable 
     // ... 
    }; 
} 
+0

有些事情讓我對這個答案感到困惑......它是否意味着進程ID在退出時比啓動時有所不同?如果沒有,那麼代碼的目的是什麼? –

+0

@AaronAnodide:不,進程ID [不會更改](http://msdn.microsoft.com/en-us/library/system.diagnostics.process.id.aspx):「直到進程終止,進程標識符唯一標識整個系統的進程。「您可以在流程啓動後立即閱讀其價值。此代碼的目的是顯示進程終止後如何使用此ID。 – Douglas

+0

那麼爲什麼不使用((處理)發件人).Id?在這裏引入閉包的問題看起來像是矯枉過正(對我來說 - 也許有些東西我不明白哪一個是我評論的唯一原因) –