2013-06-06 153 views
24

在C#class Process繼承自class Component,實施IDisposable,所以我可以撥打Dispose()任何Process對象。我真的必須嗎?我如何知道我是否真的必須?Process.Dispose()實際上做了什麼?

假設我有以下代碼:

var allProcesses = System.Diagnostics.Process.GetProcesses(); 
var processesNames = processes.Select(p => p.ProcessName); 
// output process names here 

現在看起來像我有Process對象的數組和我有工藝一個try-finally遍歷數組和Dispose()每個對象。這絕對是很多額外的代碼。

Dispose()Process做了什麼?我真的需要Dispose()Process對象,我該如何決定是否需要這樣做?

+0

反射時間? –

回答

23

我真的需要Dispose()Process對象,我該如何決定是否需要這樣做?

是的,你應該處置它們。請注意0​​文檔中的以下文本:

系統進程在系統中由其進程標識符唯一標識。像許多Windows資源一樣,一個進程也可以通過句柄來識別,而這個句柄在計算機上可能不是唯一的。句柄是資源標識符的通用術語。操作系統保留通過Process組件的Handle屬性訪問的進程句柄,即使進程已退出。因此,您可以獲取進程的管理信息,例如ExitCode(通常是成功爲零或非零錯誤代碼)和ExitTime。手柄是非常寶貴的資源,因此泄漏手柄比泄漏內存更具毒性。

所以,如果你不這樣做Dispose他們,你可能泄漏手柄(直到他們收集垃圾 - 但Dispose整點是爲了讓資源的早期清理)


請注意,同樣的文檔表明Process覆蓋Dispose(bool)-另一個線索,它實際上東西Dispose被稱爲。

+1

我會喜歡'使用(IEnumerable ...)'這裏:) – eFloh

+2

@eFloh - 不知道你在那裏瞄準什麼。 'using'語句引入了一個新的變量和一個將使用該變量的範圍。因此,雖然「使用」只能用於一次性物品,但重點幾乎總是要在該範圍內使用它們的「非一次性」方面。 –

+0

只是一個很好的syntaqx縮寫...專門針對這些情況下,你有一個一次性使用的完整列表,這將是很好的有一個語法最終處置掉它們,而不需要'finally {foreach(... x。 ..){x.Dispose(); }}' – eFloh

相關問題