c# - 何时将对象返回到其池中

标签 c# multithreading garbage-collection objectpool

我想在我的 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/

相关文章:

c# - 这个hash函数会不会异常频繁的碰撞?

c# - 为什么我的系统在写入控制台时会发出蜂鸣声

c# - 如何在不从 C# 中的 Expression.Convert 转换的情况下获取可空值(字段)的表达式?

c# - 垃圾收集器的替代品是什么?

c# - 如何在 log4net 中注册自定义 IObjectRenderer?

c - 字节数组中的原子设置位

c - 在多线程环境中捕获信号

c++ boost线程glibc检测到无效指针

java - 这会导致垃圾收集问题吗

java - JFrame 对象准备好进行垃圾回收的条件