我在这里看到了thread,但没有得到任何答案。
我的理解:
原生资源的回收将始终发生!
GC
时(第二轮之后)Using
那为什么我需要继承CriticalFinalizerObject
?
我没有看到任何不会回收资源的情况......
我错过了什么?
答案 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
。