ReRegisterForFinalize SuppressFinalize现实生活中的例子

时间:2011-10-22 17:21:51

标签: c# .net garbage-collection suppressfinalize

我刚读这篇文章, 杰弗里里希特的“Garbage Collection: Automatic Memory Management in the Microsoft .NET Framework”,我无法想到使用ReRegisterForFinalizeSuppressFinalize的任何真人生活样本。

有人能提供一些例子吗?

3 个答案:

答案 0 :(得分:10)

它在.NET框架中使用的一些地方,总是一个好看的地方。基本模式是:

  • 被处置物体被重复使用。 Dispose()方法调用了SuppressFinalize,因此需要重新注册(NativeWindow,RequestContextBase,TaskExceptionHolder类)
  • 终结器失败并发现异常。没什么可做的,但稍后重试。该代码包含if(!Environment.HasShutdownStarted&&&!AppDomain.CurrentDomain.IsFinalizingForUnload()),以确保这样做有意义(DynamicResolver和LoaderAllocatorScout类)
  • 对象参与缓存方案并重新缓存(OverlappedData类)

答案 1 :(得分:4)

IDisposable的实施通常需要SuppressFinalize:代码herehere

我现在没有关于ReRegisterForFinalize的好例子。

答案 2 :(得分:1)

复活实例时需要ReRegisterForFinalize。复活(在链接文章中提到)是从其析构函数(终结器)重新生成对象的操作。

只会将问题移到“你什么时候复活一个物体”。在我对this question的回答中,我推测连接池或类似的构造可能会使用它。