c# - 从终结器访问不可终结的对象

标签 c# finalizer

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

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

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

This means that finalizers should never access other finalizable objects (objects without finalizers, however, are just fine)

MSDN 中对此有任何确认吗?

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

谢谢

最佳答案

Currently I want to acquire lock object with variable of type object

在终结器中访问该对象没问题,它没有任何反应。实际上使用 lock 语句,这不太好。阻塞终结器线程往往会导致字节错误。它在程序退出时有超时,它必须在两秒内完成并完成所有操作。您无法承受 Monitor.TryEnter() 来避免触发该超时,这将是严重的资源泄漏。

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

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

关于c# - 从终结器访问不可终结的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17210071/

相关文章:

.net - 在终结器中访问引用类型成员变量是否安全?

java - 为什么在 wicket 模型中 Finalize 方法被调用 2 次

c# - 如何使用 protobuf-net 或其他序列化程序序列化第 3 方类型?

c# - 在 PropertyChange 的 ItemsControl 中为派生的 ObservableCollection<T> 重新排序呈现的项目

c# - EF7(核心)中同一个表的多个关系

c# - 完成队列卡住

java - 有效的 Java - 永远不要依赖终结器来更新关键的持久状态

c# - 如何正确解决带有重复名称标签的MVVM脚手架问题? (ASP核心2.2)

c# - mvc5 全局认证检查

c# - 删除老式的终结器