.net 当资源可能被多个客户端使用时,如何处置资源?

.net 当资源可能被多个客户端使用时,如何处置资源?,.net,idisposable,.net,Idisposable,我正在实现一个管道模式,资源(比如图像对象)将通过管道,我不知道有多少客户机持有该资源,那么如何更好地处理该资源?我认为您实际上只有两种选择 1) 有人拥有该对象,并控制对该对象的访问。因此,当它决定不再需要它时,它必须将其处理掉。这是很好的旧手动资源管理 2) 您不处理它,必须等待GC收集并调用实例上的终结器。任何实现IDisposable的对象还应该有一个终结器,如果未调用Dispose,该终结器将处理sam elogic。如果调用dispose,则不必执行此额外步骤,而且GC更高效。立即想

我正在实现一个管道模式,资源(比如图像对象)将通过管道,我不知道有多少客户机持有该资源,那么如何更好地处理该资源?

我认为您实际上只有两种选择

1) 有人拥有该对象,并控制对该对象的访问。因此,当它决定不再需要它时,它必须将其处理掉。这是很好的旧手动资源管理


2) 您不处理它,必须等待GC收集并调用实例上的终结器。任何实现IDisposable的对象还应该有一个终结器,如果未调用Dispose,该终结器将处理sam elogic。如果调用dispose,则不必执行此额外步骤,而且GC更高效。

立即想到的方法是将资源包装在某种形式的引用计数“包装器”中,以便在引用计数释放为零时可以对其进行处理

大概是这样的:

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();
        }
    }
}
public类RefCountingWrapper,其中T:IDisposable,new()
{
私有int referenceCount=0;
私人旅游资源;
公共RefCountingWrapper(T项)
{
资源=项目;
}
公共采购
{
referenceCount++;
返回资源;
}
公开无效释放()
{
参考计数--;

如果(referenceCount#2不实用,因为我有很多要创建的资源,必须及时处理它以避免耗尽内存。您可能应该从Acquire返回一个一次性对象,并让该对象的dispose执行递减。然后程序员可以使用using()来保护Acquire的每次使用声明,如果他们搞砸了,那么至少会有一个终结器过来清理。@Chris,我想你误解了OPs的意图,他们想要一个可由多个“东西”使用的一次性对象如果Acquire返回的项已被释放,则该项将不再可用。除非您建议使用双包装器,否则RefCountingWrapper.Acquire将返回wrapper.Instance在using()中使用的包装器block?虽然这开始使它变得非常复杂,包装代码比实际的“完成工作”要多代码..不,这就是我所想的。虽然这个包装类需要稍微多一些代码,但它简化了所有使用此代码的地方。重用标准.Net习惯用法比一起创建一个新流程要好。实际上也没有那么多代码,它将“Release”重命名为“Dispose”然后把它转到另一门课上。