Process.Dispose()实际上做了什么?

在C# class Processinheritance自实现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占用的内存。