我有一个创建成本很高的对象,它使用一些非托管资源,这些资源在完成后必须显式释放,因此实现 IDisposable()。我想要一个缓存,例如这些昂贵的资源,以便最小化创建成本,但我不知道如何处理处置。
如果使用对象的方法负责处置,那么我最终会在缓存中得到已处置的实例,然后必须重新创建这些实例,从而破坏了缓存的意义。如果我不在使用它们的方法中处置对象,那么它们永远不会被处置。我认为当它们从缓存中取出时我可以处理它们,但随后我可能最终会处理一个仍在被方法使用的实例。
让它们超出范围并由垃圾收集器收集并释放此时的资源是否有效?这感觉是错误的,并且违背了它们是一次性的想法......
一次性物品总是需要有一个明确的所有者来负责处置它们。然而,这并不总是创建它们的对象。此外,所有权可以转让。
认识到这一点,解决方案就变得显而易见了。不要丢弃,回收!您不仅需要一种从缓存获取资源的方法,还需要一种返回资源的方法。此时,缓存再次成为所有者,并且可以选择保留资源以供将来使用或处置它。
public interface IDisposableItemCache<T> : IDisposable
where T:IDisposable
{
/// <summary>
/// Creates a new item, or fetches an available item from the cache.
/// </summary>
/// <remarks>
/// Ownership of the item is transfered from the cache to the client.
/// The client is responsible for either disposing it at some point,
/// or transferring ownership back to the cache with
/// <see cref="Recycle"/>.
/// </remarks>
T AcquireItem();
/// <summary>
/// Transfers ownership of the item back to the cache.
/// </summary>
void Recycle(T item);
}
edit:我刚刚注意到这个想法在Spring中也存在,在那里它被称为对象池 http://www.springframework.net/doc/sdk/2.0/html/Spring.Core~Spring.Pool.IObjectPool_members.html. Their BorrowObject
and ReturnObject
方法与我的示例中的方法匹配。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)