C# 信号量lim似乎不同步

C# 信号量lim似乎不同步,c#,multithreading,semaphore,C#,Multithreading,Semaphore,我正在使用一个SemaphoreSlim类来尝试控制我当时拥有的并发db连接的数量,但在我有多个线程的地方,n-1个线程成功完成,但最后一个线程抛出了信号量完全异常。我理解这意味着,与等待调用相比,我有太多的释放调用,但我无法在下面的示例代码中找出这是如何发生的 public static SemaphoreSlim Bouncer = new SemaphoreSlim(1,1) public void WriteDB() { int retry = 0; bool esca

我正在使用一个SemaphoreSlim类来尝试控制我当时拥有的并发db连接的数量,但在我有多个线程的地方,n-1个线程成功完成,但最后一个线程抛出了信号量完全异常。我理解这意味着,与等待调用相比,我有太多的释放调用,但我无法在下面的示例代码中找出这是如何发生的

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");
     }
}
公共静态信号量lim Bouncer=新信号量lim(1,1)
公共无效写入b()
{
int重试=0;
bool-escape=false;
while(重试<5&!转义)
{
尝试
{
保镖,等等;
使用(SQLConnection con=新SQLConnection con)
{
/*在这里准备SQL命令*/
con.Open();
while(con.State!=ConnectionState.Open&重试<5)
{
睡眠(500);
重试++;
}
com.ExecuteNonQuery();
con.Close();
逃避=真实;
}
}
捕获(例外情况除外)
{
if(con.State!=ConnectionState.Closed)
{
con.Close();
}
重试++;
睡眠(300);
}
最后
{
弹跳器释放();
}
}
如果(重试>=5)
{
抛出新异常(“超过最大重试次数”);
}
}

当我查看日志信息时,时间似乎是正确的。失败的总是最后一个。在我的测试测试中,甚至没有记录任何其他错误,因此我不确定如何提前到达finally{}语句。

我只能想到两种情况。这两种代码都存在于泛型类中,因此存在多个静态变量。或者您正在使用Thread.Abort()。不要中止线程。我只能想到两种情况。这两种代码都存在于泛型类中,因此存在多个静态变量。或者您正在使用Thread.Abort()。不要中止线程。