43

在 C#中class Process继承自class Component该实现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()每个Process对象吗?我如何决定是否需要这样做?

4

2 回答 2

39

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

是的,你应该处理它们。请注意以下文档中的文本Process

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

所以如果你不这样做Dispose,你可能会泄漏句柄(直到它们被垃圾收集 - 但重点Dispose是允许及早清理资源)


另请注意,相同的文档表明Process覆盖- 另一个线索表明它在被调用时Dispose(bool)实际上做了一些事情。Dispose

于 2013-06-06T08:40:06.587 回答
0

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

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

于 2013-06-06T08:53:46.137 回答