【问题标题】:What does Process.Dispose() actually do?Process.Dispose() 实际上做了什么?
【发布时间】:2013-06-02 04:19:00
【问题描述】:

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

【问题讨论】:

    标签: c# .net idisposable


    【解决方案1】:

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

    是的,您应该丢弃它们。请注意Process 的文档中的此文本:

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

    因此,如果您不Dispose 它们,您可能会泄漏句柄(直到它们被垃圾收集 - 但Dispose 的全部意义在于允许及早清理资源)


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

    【讨论】:

    • 我会喜欢这里的using (IEnumerable<IDisposable> ...) :)
    • @eFloh - 不确定你的目标是什么。 using 语句引入了一个新变量和一个使用该变量的范围。因此,虽然using 只能用于一次性对象,但重点几乎总是在该范围内利用它们的“非一次性”方面。
    • 只是一个不错的 syntaqx 缩短器...特别是对于这些情况,您有一个完整的一次性用品列表,最好有一个语法来最终处理它们而不需要 finally {foreach(...x...){ x.Dispose(); }}
    • @KyleDelaney - 不,我更喜欢Dispose 而不是Close。在这种情况下,这种关系是相反的(Dispose 调用Close)。但是Dispose 还会执行少量额外的清理工作(例如取消注册此实例以进行最终确定),这将使事情变得“更干净”。
    • @Harry - 当然还有CloseHandle:“关闭进程句柄不会终止关联进程或删除进程对象。要删除线程对象。 ..”
    【解决方案2】:

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

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

    【讨论】:

    • 我没有投反对票,但这并不能真正回答问题,它只是解释了 Dispose 方法“一般”的含义(我假设 OP 已经知道) .
    猜你喜欢
    • 2020-11-21
    • 2015-02-26
    • 2017-06-29
    • 2013-06-13
    • 2021-10-25
    • 2011-08-12
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    相关资源
    最近更新 更多