我有一個System.Diagnostics.Process
的實例,它是通過Process.GetProcessesByName
創建的。Process.HasExited競爭條件
我成功打開該進程後,執行各種操作,例如讀取其內存和窗口標題。
這個操作是基於一個定時器不斷執行的,我的意思是Timer.Elapsed
事件處理程序是過程操作的來源。
現在,我注意到,我有一個競爭條件,我一直無法使用我知道的任何東西來解決。這是怎麼回事了:
timerElapsedEvent(...) {
if (!process.HasExited) {
process.Refresh(); // Update title.
var title = process.MainWindowTitle;
}
}
如果該進程正在運行,我的代碼進入if
塊,有一個小的機會在執行process.MainWindowTitle
調用之前的過程可能會退出,這將導致異常。
我需要的是一個辦法以某種方式捕捉過程的退出事件,並保持它活着,直到可以安全地關閉它沒有崩潰我的應用程序,它正在監視它,從而確保它會等待process.MainWindowTitle
關閉之前(或任何其他可以解決此問題的解決方案)。
此外,與此同時,另一種方法可能會運行ReadProcessMemory
,這也會崩潰。
我該如何解決這個問題?
PS:Process.Exit事件處理程序不起作用,因爲它不會在process.MainWindowTitle
之前被觸發,它只會在當前指令完成後觸發。 我敢肯定,以某種方式控制退出事件是解決此問題的唯一方法,因爲HasExit可能會隨時更改,而不會在實際調用過程中的方法之前進行多少次檢查。
PS2:我剛剛意識到這是一個TOCTTOU情況,除非我可以控制我打開的過程,否則它是無法解決的,所以我只是爲了看看有沒有人知道這種方法。
簡單地捕獲'InvalidOperationException'並將其視爲已退出的進程有什麼問題?在處理外部過程時,存在各種各樣的基本上難以解決的競爭條件;你的代碼只需要準備好處理可能發生的錯誤。 –
嘿,彼得!捕捉異常沒什麼問題,我只是想確保沒有辦法同步這些線程或其他東西,這是沒有解決方案的。 – victor
無論你做什麼(在理由之內......如果你準備rootkit系統並接管Windows內核,我想你可以做任何你想要的東西:)),這個過程可能會被殺死,沒有任何可能與它同步。就像人們必須始終準備好趕上'FileNotFoundException'一樣,即使剛剛看到過'File.Exists()'返回'true',你自己的代碼也需要始終爲進程準備好退出,即使Process.HasExited '財產剛剛返回'true'。 –