如何在多个客户端使用资源时处置资源?

时间:2010-01-28 15:31:11

标签: .net idisposable

我正在实现一个管道模式,资源,比如图像对象,将通过管道,我不知道有多少客户端持有资源,那么处理资源的更好方法是什么?

2 个答案:

答案 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();
        }
    }
}

适用的注意事项:

  • 任何已经获得Acquire结果并且持有对它的引用的人现在都会引用已被处置的东西(也就是说,一旦它们发布它们,它们就不应该尝试访问它!)。
  • 这很容易受到与其Acquire和Release相匹配的人的影响,从而可能导致其他人无意中遇到被处置对象。如果您控制所有使用资源/调用Acquire / Release的代码,那么这不应该是一个大问题。
  • 你可能想要对Acquire / Release方法进行一些锁定,如果有一丝多线程代码附近有一些包裹的内容。
  • 绝对没有什么可以阻止使用获取资源在底层资源上调用.Dispose()的代码