Объекта 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;
}