1

すでに開いている接続を渡すことで、LINQ toSQLDataContextを作成しています。これは機能しますが、終了時に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)呼び出しDispose、自動的に閉じることを処理する必要があります。ProviderConnection

于 2012-02-16T17:00:16.703 に答える