我想在没有终结器的情况下从其他实例的终结器访问对象。
我知道从终结器访问其他可终结对象是个坏主意,因为终结器调用的序列是非确定性的。
但是如何在没有终结器的情况下从其他对象的终结器访问实例呢? 我无法弄清楚这一点,这是文章http://edn.embarcadero.com/article/29365中唯一找到的:
这意味着终结者永远不应该访问其他可终结的 对象(没有终结器的对象,就好了)
MSDN中是否有此确认?
目前我想获取类型为object
的变量的锁对象,但我想确保它没有问题,并且object
实例在访问之前不会从内存中释放。
由于
答案 0 :(得分:1)
目前我想获取类型为object的变量的锁对象
在终结器中访问该对象很好,没有任何反应。实际上使用它是 lock 语句,这不太好。阻止终结器线程会导致字节错误。它在程序退出时超时,必须完成并在两秒钟内完成所有内容。你买不起Monitor.TryEnter()来避免超时,这将是一个糟糕的资源泄漏。
请注意代码味道,当其他线程仍然可以访问它时,您不应该释放您为终结器编写的任何本机资源。只有当 nobody 保持对对象的引用时,终结器才能运行。这也应该意味着锁定不再有任何意义,因为任何线程都不能再有引用了。当没人能读或写时,没有必要用锁来保护共享状态。
请记住,实际编写终结器几乎总是错误的,本机资源应该由相应的.NET包装器类完成。有许多,低级的是SafeHandle派生类。
答案 1 :(得分:0)
直到拥有根目录才收集对象。假设您正在讨论的object
实例是正在最终确定的对象的成员,那么object
一直处于活动状态 - 因为root是f-reachable queue。
但是,我强烈建议不要在终结器中进行任何锁定或阻止。它可能导致丑陋的僵局。