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

sha*_*oth 35 .net c# idisposable

在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
Run Code Online (Sandbox Code Playgroud)

现在看起来我有一个Process对象数组,我已经设计了try-finally遍历数组和Dispose()每个对象.这肯定是很多额外的代码.

Dispose()Process物体有什么作用?我是否真的需要Dispose()每个Process对象,我如何决定是否需要这样做?

Dam*_*ver 35

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

是的,你应该处理它们.请注意文档中的以下内容Process:

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

因此,如果你不这样做Dispose,你可能会泄漏手柄(直到他们被垃圾收集 - 但重点Dispose是要尽早清理资源)


另请注意,相同的文档表明Process覆盖Dispose(bool)- 另一个线索,它实际上在调用时执行某些操作Dispose.

  • 我想要一个`使用(IEnumerable <IDisposable> ...)`这里:) (3认同)
  • @KyleDelaney - 不,我更喜欢`Dispose`而不是'Close`.在这种情况下,这种关系是相反的(`Dispose`调用`Close`).但是`Dispose`还会执行少量的额外清理(例如取消注册此实例以进行最终确定),这将使事情"更清洁". (3认同)
  • @eFloh - 不确定你的目标是什么.`using`语句引入了一个新变量和一个使用该变量的范围.因此,虽然"使用"只能用于一次性物品,但几乎总是要在该范围内利用其"非一次性"方面. (2认同)
  • @Harry-,当然还有[`CloseHandle`](https://docs.microsoft.com/zh-cn/windows/win32/api/handleapi/nf-handleapi-closehandle):“关闭进程句柄*确实不会终止关联的进程*或删除进程对象。要删除线程对象...” (2认同)