C# 释放连接时是否未调用DbConnection.StateChange?

C# 释放连接时是否未调用DbConnection.StateChange?,c#,semaphore,idisposable,dbconnection,C#,Semaphore,Idisposable,Dbconnection,我有一个单例数据库类,它可以同时从数百个线程访问。每个线程都有自己的连接。因为我不能控制线程的数量,所以我需要限制并发连接的数量。我决定使用一个信号灯,如下所示。现在,连接总是使用块在中分配,因此即使抛出异常,它也确实会被关闭 但是,当抛出异常时,似乎不会调用。显然,这破坏了我下面的代码 问题:如何确保在此场景中确实调用了StateChange?或者,如果不可能,我如何解决这个特殊问题 private const int MAX_CONNECTIONS = 10; private static

我有一个单例数据库类,它可以同时从数百个线程访问。每个线程都有自己的连接。因为我不能控制线程的数量,所以我需要限制并发连接的数量。我决定使用一个信号灯,如下所示。现在,连接总是使用块在
中分配,因此即使抛出异常,它也确实会被关闭

但是,当抛出异常时,似乎不会调用。显然,这破坏了我下面的代码

问题:如何确保在此场景中确实调用了
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;
}

好的。。。如果在调用
OpenConnection
后生成异常,则似乎确实调用了该事件。当我测试这个时,我在返回连接之前放置了一个显式的
抛出新异常()。。。哎呀

我可以问一下为什么不能使用默认的ADO.NET吗?不确定这会有什么帮助?如果达到最大连接数,线程应如上所示等待。