日期:2014-05-17  浏览次数:20491 次

关于asp.net调用sqlserver2005出现的【向信号量添加给定计数将导致其超出它最大计数】
我的系统开发环境如下:
1、一套ms管理系统,然后增加了ic卡硬件身份验证和读写卡操作;
2、有一个管理员身份卡,每个页面登陆验证都需要读一次卡中身份信息;
3、其他的就是普通的数据库管理操作:增删改查。
4、开发环境:vs2008 和sqlserver2005

现在我的系统每过一段时间就出现一个BUG如下所示。我查了网上资料资料很少啊。在这里求问各位高手。遇到过这个情况么。关键是怎么解决。每次重启电脑、重启iis、重启sql服务是可以暂时解决。但是这也不是办法啊。在代码中怎么处理能解决问题啊。
非常感谢啊!



问题描述:
未处理 System.Threading.SemaphoreFullException  Message="
向信号量添加给定计数将导致其超出它最大计数。"Source="System"
 
sqlserver asp.net 数据库

------解决方案--------------------
http://bbs.csdn.net/topics/290052410
------解决方案--------------------
信号量的计数在每次线程进入信号量时减小,在线程释放信号量时增加。当计数为零时,后面的请求将被阻塞,直到有其他线程释放信号量。当所有的线程都已释放信号量时,计数达到创建信号量时所指定的最大值。如果编程错误导致线程在此时调用 System.Threading.Semaphore.Release 方法,将引发 SemaphoreFullException。

SemaphoreFullException 不一定表示发生异常的代码有问题。比如下面这种情况:线程 A 和线程 B 进入一个最大计数值为 2 的信号量。线程 B 的编程错误导致其调用两次 Release,从而使该信号量的计数已满。因此,当线程 A 最终调用 Release 时,引发了 SemaphoreFullException。

以上来自MSDN

我觉得可以写try catch在发生SemaphoreFullException类型异常的时候将它屏蔽掉。


try
{
    _pool.Release();
    Console.WriteLine("Thread A released the semaphore.");
}
catch(Exception ex)
{
    Console.WriteLine("Thread A: {0}", ex.Message);
}

------解决方案--------------------
你还是抛出异常试试。
1,重启IIS能结束的,查查 报错是连接池的状况
这么着,把你的关键代码复制过来看看
------解决方案--------------------
我自己没碰到过。你使用Semaphore了吗?

看看下面的讨论:
http://stackoverflow.com/questions/6876659/semaphorefullexception-when-checking-user-role-via-asp-net-membership

http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders/thread/b5b7a179-3737-4380-b6cf-843f3e71b317/
------解决方案--------------------
问题就是,出了这个异常以后。我的数据库就不能用了。随便写个测试代码连接数据库都失败。
-------------------------------
错误明显啊。
1,查看连接池。
2,数据库有个跟踪功能,你跟踪并发数据,数据库设置搞一下,比如超时 长一些,数据表索引等等。
------解决方案--------------------
引用:
问题就是,出了这个异常以后。我的数据库就不能用了。随便写个测试代码连接数据库都失败。
-------------------------------
错误明显啊。
1,查看连接池。
2,数据库有个跟踪功能,你跟踪并发数据,数据库设置搞一下,比如超时 长一些,数据表索引等等。

推荐楼主适用