【发布时间】:2011-01-17 08:36:02
【问题描述】:
这几乎只是为了确保我做对了:
我们有一个实现 IDisposal 模式的大型资源类。它应该(通过设计)以某种方式实现,使其能够被多次调用(即使我们尝试准确地调用它一次)。我们还实现了一个终结器,它也调用 Dispose() 方法 - 就像备份一样。如果手动调用,Dispose() 也会调用 GC.SuppressFinalize(this)。
周围有几个处置模式的例子。他们中的大多数在处理代码的 end 处调用 GC.SuppressFinalize(this)。有人声称,最好在 Dispose() 方法的开头调用它,在任何清理之前。后者争辩说,这将确保 GC 在我们仍在清理时不会同时调用终结器。
问题:
看来,将 GC.SuppressFinalize 放在开头并没有更好的效果?我们还有比赛条件,对吧?那么,我们宁愿以线程安全的方式实现 Dispose() 是真的吗?
【问题讨论】:
-
dispose 模式,如 .NET 框架设计指南中所述,最后有
GC.SuppressFinalize调用。该指南在 Microsoft 内部进行了深入讨论,最终形成了这样的模式。
标签: c# .net thread-safety dispose finalizer