我需要在Dispose方法中调用GC.KeepAlive(this)吗?

时间:2009-05-03 11:23:00

标签: .net memory-management

this question @Jon双向飞碟由当局Chris Brumme引用此old blog post

我想知道,我是否需要使用GC.SuppressFinalize(this)来跟踪对GC.KeepAlive(this)的所有调用,以避免在处理器在大量多线程应用程序中运行期间可以调用终结器的奇怪竞争条件?

如果是这样,你能想出一个暴露这个bug的示例程序吗?

3 个答案:

答案 0 :(得分:7)

没有。 GC.KeepAlive实际上并没有做任何事情;它的目的是“愚弄”运行时,防止特定对象在方法开始和GC.KeepAlive调用之间被垃圾收集。

任何方法调用都会以这种方式使对象保持活着:您可以将其传递给Console.WriteLine,调用ToString,甚至...... GC.SuppressFinalize

(或者如MSDN所说:

  

KeepAlive方法不执行任何操作,除了延长作为参数传入的对象的生命周期外,不会产生任何副作用。)

答案 1 :(得分:2)

最近有一位同事向我提问,并在我的博客上发布了答案,并附有示例代码:

http://nitoprograms.blogspot.com/2009/08/q-if-dispose-calls-suppressfinalize-is.html

您可能也对我的其他Disposable博客文章感兴趣,其中一篇博文探讨何时需要SuppressFinalize或KeepAlive。

答案 2 :(得分:0)

好奇,在什么情况下会出现问题?假设Dispose()方法超出了它引用对象的任何成员的点。释放对象的终结器会出现什么问题?