我正在使用SemaphoreSlim类来尝试控制我当时的并发数据库连接的数量,但是无论我在哪里运行多个线程,n-1个线程都会成功完成,但是最后一个线程将引发Semaphore完全异常。我了解到的含义是,与等待调用相比,我有太多的释放调用,但是我无法终生在下面的示例代码中弄清楚这是怎么发生的
public static SemaphoreSlim Bouncer = new SemaphoreSlim(1,1)
public void WriteDB()
{
int retry = 0;
bool escape = false;
while (retry < 5 && !escape)
{
try
{
Bouncer.Wait();
using(SQLConnection con = new SQLConnection con)
{
/*Prep SQL command here*/
con.Open();
while (con.State != ConnectionState.Open && retry < 5)
{
Thread.Sleep(500);
retry++;
}
com.ExecuteNonQuery();
con.Close();
escape = true;
}
}
catch (Exception ex)
{
if (con.State != ConnectionState.Closed)
{
con.Close();
}
retry++;
Thread.Sleep(300);
}
finally
{
Bouncer.Release();
}
}
if (retry >= 5)
{
throw new Exception("Maximum Retries Exceeded");
}
}
当我查看日志信息时,时机似乎正确。它总是最后一个失败的方法。在我的测试试用中,甚至没有任何其他错误被记录下来,因此我不确定如何尽早到达finally {}语句。