2

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

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

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

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

MSDN中对此有任何确认吗?

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

谢谢

4

2 回答 2

1

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

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

并注意代码气味,当其他线程仍然可以访问它时,您不应该释放您编写终结器的任何本机资源。终结器只有在没有人再保留对对象的引用时才能运行,这是福音。这也应该意味着锁定不再有任何意义,因为不再有线程可以引用。当没有人可以读取或写入共享状态时,无需使用锁来保护共享状态。

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

于 2013-06-20T12:44:04.420 回答
0

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

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

于 2013-06-20T11:31:43.283 回答