『QQ:1353814576』

SemaphoreSlim向信号量添加给定计数将导致其超出它的最大计数报错问题原因


SemaphoreSlim向信号量添加给定计数将导致其超出它的最大计数报错问题

报错问题描述

近期在优化一个.NET程序的数据库并发操作导致的性能问题,原因是由于某些业务高峰时间段会有大量的数据触发数据库的并行线程更新写入操作,但由于服务其的配置比较拉跨,时不时会因为数据库资源不够用而出现更新写入数据超时失败的情况,导致时不时需要手动去补数据就很烦,所以引用了SemaphoreSlim来控制关于数据库的异步并发线程更新新增操作,来减少对数据库的压力。

测试过程中出现了问题 如题报错向信号量添加给定计数将导致其超出它的最大计数,百度上虽然找到了类似的问题,但没找到造成该问题的原因,经过不断的测试最终让我发现了问题原因(仅代表我自己的情况),其实就是自己写代码逻辑还是不够严谨导致

错误代码例子

SemaphoreSlim semaphoreSlim = new SemaphoreSlim(1, 1);
var query = 1;//模拟测试条件
try
{
    if (query == 1) return;//问题就出在在这里
    semaphoreSlim.Wait();

    //后续正常业务

}
catch (Exception ex)
{

}
finally
{
    semaphoreSlim.Release();
}

导致错误原因

问题其实很简单就是当query参数为1的时候触发了return,没有执行到 semaphoreSlim.Wait() 这一步,但由于加了try做异常捕获且在finally里执行了 semaphoreSlim.Release(),简单来说就是没有执行阻塞请求的情况下 直接执行了释放信号导致了报错。