SemaphoreSlim似乎不同步

时间:2019-02-15 18:18:29

标签: c# multithreading semaphore

我正在使用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 {}语句。

0 个答案:

没有答案