6

我刚刚在读这篇文章,“<a href="https://web.archive.org/web/20130418095110/http://msdn.microsoft.com/en-us/library/bb985010.aspx" rel=" nofollow">垃圾收集:Microsoft .NET Framework 中的自动内存管理”,作者 Jeffrey Richter,我想不出任何现实生活中使用ReRegisterForFinalize或.NET 的示例SuppressFinalize

谁能给我一些例子?

4

3 回答 3

10

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

  • 已处置的对象被重用。Dispose() 方法调用了 SuppressFinalize,因此需要重新注册(NativeWindow、RequestContextBase、TaskExceptionHolder 类)
  • 终结器失败并捕获了异常。没什么可做的,只能稍后重试。该代码用 if (!Environment.HasShutdownStarted && !AppDomain.CurrentDomain.IsFinalizingForUnload()) 包装,以确保这样做有意义(DynamicResolver 和 LoaderAllocatorScout 类)
  • 对象参与缓存方案并重新缓存(OverlappedData 类)
于 2011-10-22T19:26:09.177 回答
4

的实现IDisposable通常需要SuppressFinalize在此处此处查看代码。

我现在没有一个很好的例子ReRegisterForFinalize

于 2011-10-22T17:31:42.227 回答
1

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

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

于 2011-10-22T18:03:50.480 回答