SemaphoreSlim, кажется, не синхронизирован - PullRequest
0 голосов
/ 15 февраля 2019

Я использую класс SemaphoreSlim, чтобы попытаться контролировать количество одновременных соединений с БД, которые у меня есть в то время, но, где бы ни происходило несколько потоков, 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");
     }
}

, когда япосмотрите на информацию в журнале, по которой время кажется правильным.это всегда последний, который терпит неудачу.В моих тестовых испытаниях даже не регистрировались какие-либо другие ошибки, поэтому я не уверен, как рано добираюсь до оператора finally {}.

...