从Finalize调用时出现C#SqlTransaction.Commit错误

时间:2014-01-29 16:08:28

标签: c# sql .net-4.5

我有一个C#(.NET 4.5)类,它存储在必须提交的SQL事务中(SQL Server 2012 Express)。我已经实现了IDispose接口,如果我在using语句中实例化了类,那么它可以完美地提交事务。

然而,当有人制作这个类的模块化实例时,我无法知道何时完成该课程。因此,我实现了类finalize方法,该方法在程序结束之前调用。

但是,当我从finalize调用我的Dispose()方法时,我会在提交事务的行上获得NullReferenceException。有什么建议吗?

代码:

public class c : IDisposable

...

    ~c()
    {
        Dispose();
    }

...

    private bool _Disposed = false;

    protected virtual void Dispose(bool disposing)
    {
        if (!_Disposed)
        {
            if (disposing)
            {
                //dispose managed ressources

                if (_SqlTransactionForLockingRecord != null)
                {
                    _SqlTransactionForLockingRecord.Commit(); // Throws runtime error if called from ~c();
                    _SqlTransactionForLockingRecord = null;
                }
            }
        }
        //dispose unmanaged ressources
        _Disposed = true;
    }

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

1 个答案:

答案 0 :(得分:1)

当你的析构函数/终结器被调用时,

.net不保证。您的交易已经超时或被回收(请参阅评论)。我相信当你需要释放非托管资源时,你只需要在一些奇特的情况下调用终结器。甚至在这种情况下,Dispose大多数都有效。所以使用Dispose。

我也不确定在Dispose内部提交交易是否是一个好主意。逻辑上处理(和终结器)旨在释放资源。可以更好地明确地做到这一点。