Объекта dbConnection.StateChange не вызывается, когда соединение удалено?
У меня есть одноэлементный класс базы данных, к которому можно обращаться из сотен потоков одновременно. Каждый поток получает свое собственное соединение. Поскольку я не могу контролировать количество потоков, мне нужно ограничить число параллельных соединений. Я решил использовать семафор , как показано ниже. Теперь соединение всегда назначается в блоке 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;
}