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