我想在我的 C# 应用程序中使用对象池,而且我知道 C# 中没有任何引用计数。如果同一个对象可以传递给多个线程,我怎么知道什么时候不再有对该对象的引用,以便我可以将它返回到对象池?
我想在dispose
方法中做,但是已经太晚了,而且已经dispose了,不能再放回pool中了。
最佳答案
可以使用终结器在 .Net 中实现对象池。
实际上,大多数在 .Net 中实现的池也在这样做(例如 - 数据库连接池)。
使用终结器可以让您知道该对象不再被引用,因为在 GC 确定没有可能的对象路由之后调用终结器。
技术是不要在您的 Dispose(我将在下一个)和 finalize 方法中执行任何破坏性方法。
假设您有一个 PooledObject 类型和一个管理池的 ObjectPool 类型。
在 ObjectPool 中,添加一个名为 ReturnToPool(PooledObject obj) 的内部方法,它将获取对象并使其可供其他调用者使用。
在 PooledObject 类型中,您应该添加一个名为 ReleaseResources 的内部方法 - 只有当整个池应该从内存中删除时,ObjectPool 才会调用该方法 - 在这个方法中,您将实现您的处理逻辑(关闭句柄,释放 un -管理内存等)。 在 PooledObject Dispose 和 Finalize 方法中,您应该调用 ObjectPool 中的 ReturnToPool 方法(静态的,或者内部存储在池对象中)——这被称为——复活。 在终结器中调用 ReturnToPool 方法时,您实际上是在复活对象并使其再次可用。
确保您在 ObjectPool 的 ReturnToPool 方法中重新注册 PooledObject 以进行终结 - GC.ReRegisterForFinalize 方法。
当然,这两种类型应该在同一个程序集中。 (以确保它们可以相互调用内部方法)
然而,您应该以任何一种方式实现 Dispose 模式。当对象不再被使用时(例如离开 Using 作用域后),它将节省时间并将对象返回到池中。
希望这对您有所帮助。 Ofir.
关于c# - 何时将对象返回到其池中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14090765/