【发布时间】:2012-02-16 14:35:43
【问题描述】:
我通过传递一个已经打开的连接来创建一个 LINQ to SQL DataContext。这行得通,除了我现在到处泄漏连接,因为虽然我在完成后处理了 DataContext,但连接永远不会关闭。我知道这是设计使然。
我想做的是确保我的连接在我的 DataContext 被释放后关闭。
我试图在 DataContext 上覆盖 Dispose,如下所示:
protected override void Dispose(bool disposing)
{
this.Connection.Close();
}
但是,这不起作用...我得到一个 ObjectDisposedException。设置断点表明此时一切都已处理完毕!
我发现的唯一解决方法是在 DataContext 上隐藏 Dispose 方法。像这样:
public new void Dispose()
{
this.Connection.Close();
base.Dispose();
}
但是,这对我来说有点难闻的代码味道。在这里进行的推荐方式是什么?
完整的代码示例(DataClasses1DataContext 是一个空的DataContext):
class Program
{
static void Main(string[] args)
{
string connectionString = "server=localhost;initial catalog=master;Integrated Security=SSPI;";
for (int i = 0; i < 100; i++)
{
var connection = new SqlConnection(connectionString);
connection.Open();
var ctx = new DataClasses1DataContext(connection);
ctx.ExecuteCommand("declare @i int");
ctx.Dispose();
}
Console.ReadKey();
}
}
public partial class DataClasses1DataContext
{
protected override void Dispose(bool disposing)
{
// This will throw an ObjectDisposedException
// this.Connection.Close();
}
public new void Dispose()
{
// This will work
// this.Connection.Close();
//base.Dispose();
}
}
【问题讨论】:
-
override Dispose 方法调用的异常是什么?
-
我得到一个 ObjectDisposedException
-
ObjectDisposedException 的消息是什么?
-
System.Data.Linq.dll 中发生“System.ObjectDisposedException”类型的未处理异常附加信息:无法访问已处置的对象。
-
连接对象,实际上是所有上下文的属性,在我隐藏 Dispose(bool disposing) 覆盖时已经被释放。因为首先调用了 Dispose() 方法...
标签: c# linq-to-sql dispose idisposable objectdisposedexception