何时将对象返回到它的池

本文关键字:返回 对象 何时 | 更新日期: 2023-09-27 17:49:53

我想在c#应用程序中使用对象池,并且我知道c#中没有任何引用计数。如果同一个对象可以传递给多个线程,我如何知道什么时候不再有对该对象的引用,以便将其返回到对象池?

我想在dispose方法中这样做,但为时已晚,因为它已被处置,因此无法返回到池中。

何时将对象返回到它的池

在。net中实现对象池可以使用终结器。

实际上,在。net中实现的大多数池也在这样做(例如- DB连接池)。

使用终结器可以让你知道对象不再被引用,因为在GC确定不存在到该对象的可能路由后,会调用终结器。

技术是不要在Dispose(我将在下一个得到这个)和finalize方法中做任何破坏性的方法。

假设您有一个PooledObject类型和一个管理池的ObjectPool类型。

在ObjectPool中,添加一个名为ReturnToPool(PooledObject obj)的内部方法,该方法将获取对象并使其可供其他调用者使用。

在PooledObject类型中,你应该添加一个名为releaseresource的内部方法——只有当整个池应该从内存中移除时,ObjectPool才会调用它——在这个方法中,你将实现你的dispose逻辑(关闭句柄,释放非托管内存,等等)。在PooledObject Dispose和Finalize方法中,您应该调用ObjectPool(静态的,或内部存储在池对象中)中的ReturnToPool方法——这被称为——复活。当在终结器中调用ReturnToPool方法时,你实际上是在复活对象并使其再次可用。

确保在ObjectPool - GC的ReturnToPool方法中重新注册PooledObject以完成。ReRegisterForFinalize方法。

当然,这两种类型应该在同一个程序集中。(以确保它们可以相互调用内部方法) 但是,您应该以任何一种方式实现Dispose模式。当对象不再被使用时(例如,在离开Using作用域后),它将节省时间,并将对象返回到池中。

希望这对你有帮助。的方法。

我如何知道什么时候不再有对对象的引用,以便我可以返回它对象池。

嗯。你实现了引用计数

在它周围有一个具有Disposable方法的代理也是有效的。处理完代理后,dispose实现将内部对象放入池中(外部对象tuhs非常小)。

但是最后你必须知道什么时候释放。这叫做编程。这只对具有显著初始化开销的"胖"对象有意义,然后你必须确保你实际上知道何时通过逻辑(即自定义计数等)将它们放回。

应该在Close/Release方法中。创建和处理实例的责任在于ObjectPool本身。

使用Open/CloseAcquire/Release向ObjectPool请求/释放对象。

Code Project文章 c# Object Pooling给出了一个很好的轻量级自定义对象池实现。

您还可以查看ADO的连接池机制。