Я использую класс 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 {}.