Process.Dispose()实际上做了什么?
在C# class Process
inheritance自实现IDisposable
class Component
,因此我可以在任何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
对象,我如何决定是否需要这样做?
我是否真的需要
Dispose()
每个Process
对象,我如何决定是否需要这样做?
是的,你应该处理它们。 请注意Process
的文档中的此文本:
系统进程由系统进程标识符唯一标识。 与许多Windows资源一样,进程也由其句柄标识,该句柄在计算机上可能不是唯一的。 句柄是资源标识符的通用术语。 操作系统持久保存进程句柄,即使进程已退出,也可通过Process组件的Handle属性访问该句柄。 因此,您可以获取进程的管理信息,例如ExitCode(通常为成功为零或非零错误代码)和ExitTime。 手柄是非常有价值的资源,因此泄漏的手柄比泄漏记忆更具毒性。
因此,如果您不Dispose
它们,您可能会泄漏句柄(直到它们被垃圾收集 – 但Dispose
的全部意义是允许尽早清理资源)
另请注意,相同的文档表明Process
重写Dispose(bool)
– 另一个线索,它实际上在调用Dispose
时执行某些操作 。
来自MSDN: http : //msdn.microsoft.com/en-us/library/3cc9y48w (v= vs.80).aspx
完成使用组件后调用Dispose。 Dispose方法使Component处于不可用状态。 在调用Dispose之后,必须释放对Component的所有引用,以便垃圾回收器可以回收Component占用的内存。