我有一个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);
}
答案 0 :(得分:1)
.net不保证。您的交易已经超时或被回收(请参阅评论)。我相信当你需要释放非托管资源时,你只需要在一些奇特的情况下调用终结器。甚至在这种情况下,Dispose大多数都有效。所以使用Dispose。
我也不确定在Dispose内部提交交易是否是一个好主意。逻辑上处理(和终结器)旨在释放资源。可以更好地明确地做到这一点。