Yuan天空
Yuan天空
  • 我的主页
  • 博客随笔
  • 软件作品
    • TK精灵(进程守护)
    • 远程运维助手
    • DicomStoreSCU
    • TKOCR(离线OCR)
    • 更多...
  • 学习资源
  • 网址收藏
  • HTML模板
一个不专业的.NET开发者博客
  1. 主页
  2. 博客
  3. 发布页

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

SemaphoreSlim信号量添加超出最大计数
编程开发 2024-04-02 41

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(),简单来说就是没有执行阻塞请求的情况下 直接执行了释放信号导致了报错。

问题反馈/学习建议
1. 文明上网,理性表达,营造舒适的学习氛围
2. 请不要反馈提交与本页主题无关内容