Я создаю LINQ to SQL DataContext, передавая ему уже открытое соединение. Это работает, за исключением того, что теперь у меня везде утечка соединений, потому что, хотя я удаляю DataContext, когда я закончу, соединение никогда не закрывается. Я так понимаю, это сделано намеренно.
Что я хотел бы сделать, так это убедиться, что мое соединение закрывается после удаления моего DataContext.
Я попытался переопределить Dispose в DataContext, например:
protected override void Dispose(bool disposing)
{
this.Connection.Close();
}
Однако это не работает ... Я получаю исключение ObjectDisposedException. Установка точки останова показывает мне, что к этому моменту все уже удалено!
Единственный обходной путь, который я нашел, - это скрыть метод Dispose в DataContext. Нравится:
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();
}
}
SqlProvider
? Похоже, он всегда должен закрывать соединение. Если я не пропущу где-то, гдеconManager
устанавливается наnull
(он создается вне ветки). 16.02.2012Dispose()
. Или, если на то пошло, способ явно запросить управление, например, как обрабатываетсяStream
. 16.02.2012