stevenjin 2024-04-20 14:42 采纳率: 98.2%
浏览 10
已结题

c#后台多线程的方法中加锁失效

1.c# 单列模式的类中提供了一个读数据库列表的方法,由于某中不明原因,该方法被前端同一个请求反复调用了多次(不足几个毫秒)
2.在方法中尝试过SemaphoreSlim或AsynLock,都不能阻档多个线程同时进入方法体,产生了多个线程id
3.但是,在for循环看也加了lock,这里有看到为同一线程id。

private SemaphoreSlim lockSlim=new  SemaphoreSlim(1,1);
private readonly static object lockObj=new object():
public  dynamic GetData(int id)
{
    lockSlim.Wait();
     //打印出了多个线程id
     for(...)
      {
          lock(lockObj)
          {
            //这里只打印出一个线程id
          }
      }
  lockSlim.Release();
}
  • 写回答

5条回答 默认 最新

  • wanghui0380 2024-04-21 15:35
    关注

    额,你凭啥确认他们是同时进入的呢?

    只凭线程id不一样么??你认为线id不一样就代表他们同时进入了。

    那好,请在外面写个测试,没间隔1小时,启动一个线程访问一下你这个代码。然后用你的pid去判定他们是不是同时进入了

    很明显1个小时使用线程访问一次,他们绝不是同时进入的。但是线程id不一样。

    话说你说for的线程id一样,请问你启用线程么?没有新线程当然一样,假设你在for里写个线程看看,这还一样么?又不一样了
    多线程会影响你判定,那么我们这样把,for 启用新线程,然后放个while检查这个线程执行完毕没,没执行完毕就while到他执行完毕了,然后在for下一次,你看线程id一样不?即使是每次都是等待上一次结束才运行,这个代码的线程id也不一样。因为外面每次调用都使用了新线程


    另外请简单验证一下,第一打印后立刻sleep 30秒,你在看是否30秒打印一次。如果30秒打印一次,说明即使外面在快,也被拦了30秒后才进入的。假设他是快速连续打印,才是你认为的没锁住,他立刻就进来了__

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
    1人已打赏
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月2日
  • 已采纳回答 4月24日
  • 修改了问题 4月20日
  • 创建了问题 4月20日

悬赏问题

  • ¥15 python按要求编写程序
  • ¥15 Python输入字符串转化为列表排序具体见图,严格按照输入
  • ¥20 XP系统在重新启动后进不去桌面,一直黑屏。
  • ¥15 opencv图像处理,需要四个处理结果图
  • ¥15 无线移动边缘计算系统中的系统模型
  • ¥15 深度学习中的画图问题
  • ¥15 java报错:使用mybatis plus查询一个只返回一条数据的sql,却报错返回了1000多条
  • ¥15 Python报错怎么解决
  • ¥15 simulink如何调用DLL文件
  • ¥15 关于用pyqt6的项目开发该怎么把前段后端和业务层分离