Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net iDisposable类中的一次性对象是否保证从内存中释放?_Asp.net_Memory_Idisposable - Fatal编程技术网

Asp.net iDisposable类中的一次性对象是否保证从内存中释放?

Asp.net iDisposable类中的一次性对象是否保证从内存中释放?,asp.net,memory,idisposable,Asp.net,Memory,Idisposable,鉴于以下类别: public sealed class DistributedLock : IDisposable { private IRedLock Lock { get; } private bool _disposed; public DistributedLock(string lockKey, TimeSpan expiry) { Lock = RedLockController.GetConnection().CreateLock(

鉴于以下类别:

public sealed class DistributedLock : IDisposable
{
    private IRedLock Lock { get; }
    private bool _disposed;

    public DistributedLock(string lockKey, TimeSpan expiry)
    {
        Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
    }

    private void Dispose(bool disposing)
    {
        if (_disposed)
            return;

        if (disposing)
        {
            if (Lock != null)
            {
                Lock.Dispose();
            }
        }

        _disposed = true;
    }

    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    ~DistributedLock()
    {
        Dispose(false);
    }
}
其中,
IRedLock
实现了
iDisposable
,我以以下方式使用上述类:

using(new DistributedLock("SomeKey"))
{
    ... do something
}

DistributedLock
和contained
IRedLock
类在任何情况下都会从内存中释放吗?

IDisposable
是关于管理内存以外的资源:GDI句柄、套接字、文件句柄等。它不会抢占垃圾收集器。因此,
IDisposable
只能在两种情况下帮助您释放内存:

  • 如果您的
    IRedLock
    类型获取了非托管内存,例如通过第三方库或
    不安全的
    代码
  • 如果您的
    Dispose()
    方法从其他对象中清除对此对象的引用,以确保该对象在可能没有垃圾收集的情况下(例如,事件处理程序)有资格进行垃圾收集
  • 如果这两种方法都不适用(并且上面的代码中没有任何东西表明它们适用),那么在内存管理方面,您不会从
    IDisposable
    中获得任何好处

    在此代码中,您可以从
    IDisposable
    获得更好的机制来释放这一行中暗示的连接:

    Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
    
    但是,您可能不需要关联的终结器。您只包装已经有终结器的其他内容,因此可以使用更简单的IDisposable模式,而不需要额外的复杂性:

    public sealed class DistributedLock : IDisposable
    {
        private IRedLock Lock { get; }
    
        public DistributedLock(string lockKey, TimeSpan expiry)
        {
            Lock = RedLockController.GetConnection().CreateLock(lockKey, expiry);
        }
    
        public void Dispose()
        {
            Lock?.Dispose();
        }
    }
    

    非常感谢您的回答,新的dispose模式更容易理解。