从终结器访问非终结对象

本文关键字:对象 访问 | 更新日期: 2023-09-27 18:19:06

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

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

但是如果从其他对象的结束器访问没有结束器的实例呢?我想不出来,只能在文章中找到http://edn.embarcadero.com/article/29365:

这意味着终结器永远不应该访问其他的终结器对象(没有终结器的对象也可以)

在MSDN中是否有任何确认?

目前我想获得锁对象类型的object变量,但我想确保它是OK的,object实例在访问它之前没有从内存中释放。

从终结器访问非终结对象

当前我想获取锁对象类型为object

的变量

在你的终结器中访问那个对象是可以的,它没有发生任何事情。实际上使用语句,这不是很好。阻塞终结器线程会导致严重的字节化。它在程序退出时有一个超时,它必须完成并在两秒钟内完成所有工作。您不能使用Monitor.TryEnter()来避免触发该超时,这将是一个糟糕的资源泄漏。

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

请记住,实际编写终结器几乎总是错误的,本机资源应该由其相应的。net包装器类来终结。有很多,底层的是SafeHandle的派生类

对象在拥有根之前不会被收集。假设您正在谈论的object实例是正在完成的对象的成员,那么object一直是活动的-因为根是f可达队列。

然而,我强烈建议不要在终结器中使用任何锁或阻塞。这可能会导致丑陋的僵局。