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

1 ответ:

Хорошо... Похоже, что событие действительно вызывается, если исключение производится после вызова OpenConnection. Когда я проверял это, я поставил явный throw new Exception() непосредственно перед возвратом соединения... ой!