我正在实现一个管道模式,资源,比如图像对象,将通过管道,我不知道有多少客户端持有资源,那么处理资源的更好方法是什么?
答案 0 :(得分:2)
我认为你真的有两种选择。
1)有人拥有该对象,并控制对它的访问。因此,当它确定不再需要它时,它必须处理它。这是一个很好的旧手动资源管理。
2)你没有丢弃它,必须等待GC收集并调用实例上的终结器。如果没有调用Dispose,任何实现IDisposable的对象也应该有一个处理sam elogic的终结器。如果你调用dispose,则不必采取这个额外的步骤,GC更有效率。
答案 1 :(得分:1)
立即想到的方法是将资源包装在某种形式的引用计数“包装器”中,以便在引用计数释放为零时可以处置它。
这样的事情:
public class RefCountingWrapper<T> where T:IDisposable, new()
{
private int referenceCount = 0;
private T resource;
public RefCountingWrapper(T item)
{
resource = item;
}
public T Acquire()
{
referenceCount++;
return resource;
}
public void Release()
{
referenceCount--;
if (referenceCount <= 0)
{
resource.Dispose();
}
}
}
适用的注意事项: