我正在通過傳遞一個已經打開的連接來創建一個LINQ to SQL DataContext。這是有效的,除非我現在在各處泄漏連接,因爲儘管我在完成時處理DataContext,但連接永遠不會關閉。我明白這是設計。LINQ to SQL,重寫處理
我想要做的是確保我的連接在我的DataContext被處置後關閉。
我試圖重寫處置的DataContext的,就像這樣:
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();
}
}
覆蓋Dispose方法調用的異常是什麼? – 2012-02-16 14:40:32
我得到一個ObjectDisposedException – TheNextman 2012-02-16 14:41:38
什麼是ObjectDisposedException的消息? – jrummell 2012-02-16 14:48:06