gpt4 book ai didi

c# - 处理连接时未调用 DbConnection.StateChange?

转载 作者:太空宇宙 更新时间:2023-11-03 13:51:47 27 4
gpt4 key购买 nike

我有一个可以同时从数百个线程访问的单例数据库类。每个线程都有自己的连接。由于我无法控制线程数,所以我需要限制并发连接数。我决定使用如下所示的信号量。现在,连接总是在 using block 中分配,因此确实可以保证关闭 - 即使抛出异常也是如此。

但是,似乎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;
}

最佳答案

好的...如果在调用 OpenConnection 之后 产生异常,那么似乎事件确实被调用了。当我对此进行测试时,我在返回连接之前放置了一个显式的 throw new Exception()...哎呀!

关于c# - 处理连接时未调用 DbConnection.StateChange?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13516199/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com