2

何百ものスレッドから同時にアクセスできるシングルトンデータベースクラスがあります。各スレッドは独自の接続を取得します。スレッド数を制御できないため、同時接続数を制限する必要があります。以下に示すように、セマフォを使用することにしました。現在、接続は常にusingブロックで割り当てられるため、例外がスローされた場合でも、実際に閉じられることが保証されます。

ただし、例外がスローされた場合、StateChange呼び出されないようです。明らかに、これは以下の私のコードを壊します。

質問:StateChangeこのシナリオで実際に呼び出されていることを確認するにはどうすればよいですか?または、不可能な場合、この特定の問題をどのように解決しますか?

private const int MAX_CONNECTIONS = 10;
private static SemaphoreSlim connectionLock = new SemaphoreSlim(MAX_CONNECTIONS);

protected DbConnection OpenConnection()
{
    var connection = ProviderFactory.CreateConnection();
    connection.ConnectionString = ConnectionString;
    connection.Open();

    connectionLock.Wait();

    connection.StateChange += (s, e) =>
    {
        if (e.CurrentState == ConnectionState.Closed)
        {
            connectionLock.Release();
        }
    };

    return connection;
}
4

1 に答える 1

1

わかりました...への呼び出しのに例外が生成された場合、イベントは実際に呼び出されたようOpenConnectionです。これをテストしたときthrow new Exception()、接続を返す直前に明示的に配置しました...おっと!

于 2012-11-22T16:51:46.090 に答える