CriticalFinalizerObject使用误解吗?

时间:2012-04-01 08:16:14

标签: c# .net .net-4.0 garbage-collection

我在这里看到了thread,但没有得到任何答案。

我的理解:

原生资源的回收将始终发生!

  • 发生GC时(第二轮之后)
  • 调用dispose
  • 使用Using
  • 程序崩溃
  • 优雅终止计划

那为什么我需要继承CriticalFinalizerObject

我没有看到任何不会回收资源的情况......

我错过了什么?

3 个答案:

答案 0 :(得分:4)

  

我的观点是本机资源将永远被回收

他们不是。关键终结器在自定义托管方案中很重要。非托管任务关键程序托管CLR但不能简单地终止让操作系统在托管代码崩溃时拾取弹片的类型。

最好的例子是SQL Server。

答案 1 :(得分:2)

一切都在于掌控。有时您需要的不仅仅是回收本机资源。大多数 - 如果不是所有BCL中的本机资源使用者都实现CriticalFinalizerObject。例如,FileStream实现CriticalFinalizerObject,以便在关闭底层文件句柄之前清除所有缓存的数据。

答案 2 :(得分:2)

CriticalFinalizerObject类确实为Dispose / Finalize进程增加了一些可靠性。就像阻止Thread.Abort()等人一样。

  

那为什么我需要继承CriticalFinalizerObject?

使用Safehandle : CriticalFinalizerObject的主要原因是它使您免于处理非托管资源模式。 SafeHandle将非托管资源转换为托管资源,请参阅Joe Duffy

我不认为作为应用程序程序员你必须从CriticalFinalizerObject派生一个类,但是当你必须处理'句柄'时你应该使用SafeHandle