从终结器访问不可终结的对象

时间:2013-06-20 09:27:41

标签: c# finalizer

我想在没有终结器的情况下从其他实例的终结器访问对象。

我知道从终结器访问其他可终结对象是个坏主意,因为终结器调用的序列是非确定性的。

但是如何在没有终结器的情况下从其他对象的终结器访问实例呢? 我无法弄清楚这一点,这是文章http://edn.embarcadero.com/article/29365中唯一找到的:

  

这意味着终结者永远不应该访问其他可终结的   对象(没有终结器的对象,就好了)

MSDN中是否有此确认?

目前我想获取类型为object的变量的锁对象,但我想确保它没有问题,并且object实例在访问之前不会从内存中释放。

由于

2 个答案:

答案 0 :(得分:1)

  

目前我想获取类型为object的变量的锁对象

在终结器中访问该对象很好,没有任何反应。实际上使用它是 lock 语句,这不太好。阻止终结器线程会导致字节错误。它在程序退出时超时,必须完成并在两秒钟内完成所有内容。你买不起Monitor.TryEnter()来避免超时,这将是一个糟糕的资源泄漏。

请注意代码味道,当其他线程仍然可以访问它时,您不应该释放您为终结器编写的任何本机资源。只有当 nobody 保持对对象的引用时,终结器才能运行。这也应该意味着锁定不再有任何意义,因为任何线程都不能再有引用了。当没人能读或写时,没有必要用锁来保护共享状态。

请记住,实际编写终结器几乎总是错误的,本机资源应该由相应的.NET包装器类完成。有许多,低级的是SafeHandle派生类。

答案 1 :(得分:0)

直到拥有根目录才收集对象。假设您正在讨论的object实例是正在最终确定的对象的成员,那么object一直处于活动状态 - 因为root是f-reachable queue。

但是,我强烈建议不要在终结器中进行任何锁定或阻止。它可能导致丑陋的僵局。