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

Sam*_*ron 4 .net memory-management

这个问题中, @ Jon skeet引用了权威Chris Brumme的这篇老博客文章.

我想知道,我是否需要遵循所有来电GC.SuppressFinalize(this)GC.KeepAlive(this)避免怪异的竞争条件,其中一个终结可在一个处理器中大量多线程应用程序运行的时候被调用?

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

Tim*_*son 7

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

任何方法调用将保持一个对象活着是这样的:你可以通过它来Console.WriteLine,打电话ToString,甚至...... GC.SuppressFinalize.

(或者正如MSDN所说:

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