处理连接时是否未调用DbConnection.StateChange?

时间:2012-11-22 15:50:01

标签: c# semaphore idisposable dbconnection

我有一个单例数据库类,可以同时从数百个线程访问。每个线程都有自己的连接。由于我无法控制线程数,我需要限制并发连接数。我决定使用信号量,如下所示。现在,连接始终在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 个答案:

答案 0 :(得分:1)

好的......如果在调用OpenConnection之后产生异常,那么事件似乎确实被调用了。当我测试这个时,我在返回连接之前放了一个明确的throw new Exception() ... oops!