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

6
这个问题中,Jon Skeet提到了权威人物Chris Brumme的旧博客文章
我想知道,在高并发应用程序中,是否需要在所有对GC.SuppressFinalize(this)的调用之后跟一个GC.KeepAlive(this),以避免奇怪的竞态条件,即终结器在清理器运行期间被调用?
如果是这样,请你编写一个展示此错误的示例程序。

我认为曾经存在的任何问题现在都已经不存在了,即使我非常努力地让它失败,它也不会发生... http://gist.github.com/106190 - Sam Saffron
3个回答

8

GC.KeepAlive并不会实际做任何事情,它的目的是“欺骗”运行时,在方法开始和调用GC.KeepAlive之间防止特定对象被垃圾回收。

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

(或者按照MSDN的说法:

KeepAlive方法不执行任何操作,也不产生除扩展作为参数传递的对象的生存期之外的任何副作用。

)


3

0

只是好奇,什么情况下会出现问题?假设Dispose()方法已经超过了引用对象任何成员的点。最终器释放对象可能会出现什么问题?


如果dispose方法编码正确,我只是对CLR的运行方式感到好奇,此外,在您的释放器中添加额外的行并不是什么大问题… - Sam Saffron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接