2

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

1 回答 1

1

好的...如果调用OpenConnection. 当我对此进行测试时,我throw new Exception()在返回连接之前放置了一个显式的......哎呀!

于 2012-11-22T16:51:46.090 回答