我有一个称为DatabaseHelper类是一个包装了的DbConnection。什么是设置的正确方法这个类using语句?我已经实现IDisposible,但我不知道何时何地我要调用的Connection.close()或Connection.Dispose()。

当我只是在我自己的Dispose()方法调用Connection.Dispose(),我有时会从我的DbConnection对象SocketException。我想这是因为旧的连接被保持开放,但没有附到异常的详细信息,所以我不能知道。

有帮助吗?

解决方案

从dispose方法中调用connection.Dispose()。你应该看看的标准图案用于实现IDisposable的,它前进超出简单地实现IDisposable接口,并允许用于布置非托管对象等:

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

protected virtual void Dispose(bool disposing)
{
    if (!disposed)
    {
        if (disposing)
        {
            // Dispose managed resources.
        }

        // There are no unmanaged resources to release, but
        // if we add them, they need to be released here.
    }
    disposed = true;

    // If it is available, make the call to the
    // base class's Dispose(Boolean) method
    base.Dispose(disposing);
}

(来自 http://msdn.microsoft.com/en两者-us /库/ system.idisposable.aspx )。

其他提示

根据新闻组:

下面是IDbConnection.Dispose()如何被实现(如反射器实用程序所示):

的SqlClient:

protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             switch (this._objectState)
             {
                   case ConnectionState.Open:
                   {
                         this.Close();
                         break;
                   }
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

Odbc:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             this._constr = null;
             this.Close();
             CNativeBuffer buffer1 = this._buffer;
             if (buffer1 != null)
             {
                   buffer1.Dispose();
                   this._buffer = null;
             }
       }
       base.Dispose(disposing);
}

OleDb:
protected override void Dispose(bool disposing)
{
       if (disposing)
       {
             if (this.objectState != 0)
             {
                   this.DisposeManaged();
                   if (base.DesignMode)
                   {
                         OleDbConnection.ReleaseObjectPool();
                   }
                   this.OnStateChange(ConnectionState.Open, ConnectionState.Closed);
             }
             if (this.propertyIDSet != null)
             {
                   this.propertyIDSet.Dispose();
                   this.propertyIDSet = null;
             }
             this._constr = null;
       }
       base.Dispose(disposing);
}

您的Dispose方法应该只尝试关闭连接,如果它是开放的。

此析构函数语法是actualy终结。终结时调用Dispose(假) 方法

    #region IDisposable Members
    private bool _isDisposed;

    private void ThrowIfDisposed()
    {
        if (_isDisposed)
            throw new ObjectDisposedException(this.GetType().Name);
    }

    protected virtual void Dispose(bool disposing)
    {
        if (!_isDisposed)
        {
            if (disposing)
            {
                //part 1 : disposing managed objects
                _command.Dispose();
                _command.Connection.Dispose();
                if (_command.Transaction != null)
                    _command.Transaction.Dispose();
            }
            //part 2: disposing unmanged objects. Here there are no unmanged objects.
            _isDisposed = true;
        }
    }

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

    //~DbCommandExecutor() //No need of finalize here. Because there is no unmanged objects in my class. ie, no code in part 2.
    //{
    //    Dispose(false);
    //}
    #endregion

有是的不需要终结器(或析构函数)语法的直到码具有第2部分代码即可。否则,它应该为安全起见实现。也就是说,即使程序员没有正确调用Dispose方法,最终确定应清理非托管资源。

比较实施例:从MSDN

http://msdn.microsoft.com/en-我们/库/ system.idisposable.dispose.aspx http://msdn.microsoft.com/en-us/library/fs2xkftw.aspx

刚刚完成了IDisposable实现模式,这是公约列入相关类的终结(析构函数),它调用Dispose()方法(通过假)。这作为一个故障安全机制,允许你如果类的消费者未调用Dispose()处置非托管对象。

    ~MyClass() 
    {
        Dispose(false);
    }
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top