何百ものスレッドから同時にアクセスできるシングルトンデータベースクラスがあります。各スレッドは独自の接続を取得します。スレッド数を制御できないため、同時接続数を制限する必要があります。以下に示すように、セマフォを使用することにしました。現在、接続は常に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;
}