我有以下的代碼部分,旨在算多少Excel的進程是當前打開:如果'Process.HasExited'引發異常,我可以認爲這個過程沒有了嗎?
Func<int> OpenExcelProcessesCount =
() => System.Diagnostics.Process.GetProcessesByName("Excel")
.Where(p => !p.HasExited)
.Count();
再後來我找回伯爵在不同的點,其代碼如下所示:
int excelAppCount = OpenExcelProcessesCount();
這段代碼幾個月來一直運行良好。突然,今天,它始終給我一個例外,上面寫着以下內容:
Exception: ApplicationThreadException Message: Access is denied Stack Trace: at System.Diagnostics.ProcessManager.OpenProcess(Int32
的ProcessID,的Int32訪問,布爾 throwIfExited)
at System.Diagnostics.Process.GetProcessHandle(Int32
訪問,布爾throwIfExited)
at System.Diagnostics.Process.get_HasExited() etc...
基本上,撥打Process.HasExited
(在上面的堆棧跟蹤中顯示爲System.Diagnostics.Process.get_HasExited()
)失敗。錯誤消息「訪問被拒絕」聽起來像我沒有進程的管理權限,但現有的唯一Excel進程將在我當前用戶登錄時創建,並且用戶可以始終訪問他們自己的進程。我的.NET代碼也在完全信任下運行。
最終失敗的線路是System.Diagnostics.ProcessManager.OpenProcess(Int32 processId, Int32 access, Boolean throwIfExited)
。我想知道它是否正在爲'throwIfExited'參數傳遞一個'true'的值。如果是這種情況,那麼我想我可以用一個try-catch塊保護對Process.HasExited
的呼叫,並假設如果這個失敗了,那麼HasExited
實際上是「真實的」。但這是一個安全的假設?
我不喜歡這樣做,因爲錯誤信息是「訪問被拒絕」。有沒有人對我如何解決這個問題有任何想法,或者我可能測試什麼以試圖弄清楚發生了什麼?
我能找到堆棧溢出的唯一類似的線程如下:Why did hasExited throw ‘System.ComponentModel.Win32Exception’?。給出的答案有:
「既然你正在做的運行方式,你只 得到上同步手柄接入, 不PROCESS_QUERY_INFORMATION訪問, 因此GetExitCodeProcess失敗,這 導致hasEnded拋出一個Win32 例外。 「
我真的不明白這個答案,不知道這是否適用於我的情況,但我想我應該提到它。如果有人認爲這可能是我面臨的情況,那麼如果有人能夠爲我澄清這個答案,我將不勝感激。 (我是一個Excel的程序員,我沒有太多的經驗與流程工作。)提前
許多感謝...
更新:
盡我所知,這是令人一種一次性的腐敗。我遇到的問題開始變得越來越奇怪,因爲完美的單元測試集開始在其他「不可能」的位置出現故障。一個簡單的重新啓動糾正了這個問題以及我面對的其他一切
我最好的猜測是我有某種奇怪的腐敗。也許ROT已經崩潰了,或者我有一個懸而未決的Excel實例,它非常腐敗,甚至'流程'操作也不一定是穩定的。沒有什麼決定性的,但這是我現在可以想到的。
對於花時間回答並幫助我的響應者,我感謝你。
「我不知道,如果是的‘throwIfExited’參數‘真’的值傳遞這...這是一個安全的假設? ?」根據Reflector,HasExited爲throwIfExited傳遞了一個false值。另外,如果throwIfExited爲true,則該異常將爲InvalidOperationException,並顯示一條消息,指示進程已退出。 (對不起,我沒有你的問題的答案,但我認爲這是值得一提的,所以你沒有花時間在一個不成熟的理論。) – itowlson 2009-12-26 01:35:42
謝謝,itowlson,我真的很感激信息,這肯定有幫助。 – 2009-12-26 01:44:11