1

我通过将一个已经打开的连接传递给它来创建一个 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();
    }
}
4

1 回答 1

2

问题是在调用之前Dispose()设置。这会在您调用. 似乎没有办法解决这个问题。disposedDispose(bool)Connection

但是我不得不问,为什么这是必要的?Dispose(bool)调用which 包含Dispose并且应该自动处理关闭它。ProviderConnection

于 2012-02-16T17:00:16.703 回答