是否有必要关闭/处置SafeHandles

时间:2018-12-20 09:57:21

标签: c#

我在代码中使用SafeHandles,并注意到它们具有Close和Dispose方法。

这让我想知道SafeHandles是否由垃圾收集器处理并在使用后丢弃。

例如,如果我有一个这样的句柄,在使用完之后是否需要调用.Dispose或.Close方法。

var process Process.GetProcessesByName("notepad")[0];

var handle = process.SafeHandle;

2 个答案:

答案 0 :(得分:1)

来自documentation

  

在释放最后一个之前,始终调用Close或Dispose方法   对SafeHandle对象的引用。否则,它就是资源   直到垃圾收集器调用   SafeHandle对象的Finalize方法。

答案 1 :(得分:1)

调用CloseDispose方法可使resources成为freed。如果其他线程正在使用安全句柄的相同实例,则可能不会立即发生这种情况,但是一旦不再是这种情况就会立即发生。尽管大多数使用SafeHandle的类都不需要提供finalizer,但是有时这是必需的(例如,刷新文件缓冲区或将某些数据写回到内存中)。在这种情况下,他们可以提供保证在finalizer关键SafeHandle运行之前运行的finalizer

在释放对call对象的最后引用之前,请始终使用CloseDispose方法。否则,除非垃圾回收器调用SafeHandle对象的SafeHandle,否则它将不会释放正在使用的资源。

  

永远不要Finalize methodexplicitly call设置为Dispose method的{​​{1}}

See the Documentation