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

时间:2013-06-06 08:34:45

标签: c# .net idisposable

在C#中class Process继承自实现class Component的{​​{1}},因此我可以在任何IDisposable对象上调用Dispose()。我真的需要吗?我怎么知道我是否真的需要?

假设我有以下代码:

Process

现在看起来我有一个 var allProcesses = System.Diagnostics.Process.GetProcesses(); var processesNames = processes.Select( p => p.ProcessName ); // output process names here 个对象数组,我已经设法Process来遍历数组并try-finally每个对象。这肯定是很多额外的代码。

Dispose()Dispose()个对象做了什么?我是否真的需要Process每个Dispose()对象,我该如何决定是否需要这样做?

2 个答案:

答案 0 :(得分:32)

  

我是否真的需要Dispose()每个Process对象,我该如何决定是否需要这样做?

是的,你应该处理它们。请注意Process的文档中的此文字:

  

系统进程由系统进程标识符唯一标识。与许多Windows资源一样,进程也由其句柄标识,该句柄在计算机上可能不是唯一的。句柄是资源标识符的通用术语。操作系统持久保存进程句柄,即使进程已退出,也可通过Process组件的Handle属性访问该句柄。因此,您可以获取进程的管理信息,例如ExitCode(通常为成功为零或非零错误代码)和ExitTime。手柄是非常有价值的资源,因此泄漏的手柄比泄漏记忆更具毒性。

因此,如果你没有Dispose他们,你可能会泄漏句柄(直到他们被垃圾收集 - 但Dispose的全部意义是允许尽早清理资源)< / p>


另请注意,相同的文档表明Process会覆盖Dispose(bool) - 另一个线索,即当Dispose被调用时,它实际上会某些

答案 1 :(得分:0)

来自MSDN的

http://msdn.microsoft.com/en-us/library/3cc9y48w(v=vs.80).aspx

  

使用完Component后调用Dispose。   Dispose方法使Component处于不可用状态。   在调用Dispose之后,必须释放对Component的所有引用,以便垃圾回收器可以回收Component占用的内存。