“如何仅更新用户详细信息”;“一次”;在C#中的多线程环境中?

“如何仅更新用户详细信息”;“一次”;在C#中的多线程环境中?,c#,multithreading,concurrency,C#,Multithreading,Concurrency,大家好,我的社区 我只想在DB中更新一次用户详细信息,我们正在确保在应用层中 如果有多个具有相同用户ID的请求,我们只想用一个请求更新,其余的请求将被丢弃 如果我们使用锁,那么这个锁不应该是每个用户的,也不应该是整个并发字典 如果我们使用锁,那么这个锁应该有超时 如果在5分钟内有另一个后续更新,我们应拒绝此请求 让我们假设所有用户都可以放在一个ConcurrentDictionary中 这种方法失败了——因为多个线程可以通过if并返回True,但只有一个线程应该通过,其余线程应该返回False

大家好,我的社区

  • 我只想在DB中更新一次用户详细信息,我们正在确保在应用层中
  • 如果有多个具有相同用户ID的请求,我们只想用一个请求更新,其余的请求将被丢弃
  • 如果我们使用锁,那么这个锁不应该是每个用户的,也不应该是整个并发字典
  • 如果我们使用锁,那么这个锁应该有超时
  • 如果在5分钟内有另一个后续更新,我们应拒绝此请求
  • 让我们假设所有用户都可以放在一个ConcurrentDictionary中
  • 这种方法失败了——因为多个线程可以通过if并返回
    True
    ,但只有一个线程应该通过,其余线程应该返回
    False

    bool ShouldUpdateUser(Guid用户ID){
    TimeInTicks t=LastSeenConcurrentDictionary[userId];
    如果(DateTime.UtcNow.Ticks-t<5分钟){
    返回false;
    } 
    LastSeeConcurrentDictionary[userId]=DateTime.Now.Ticks;
    返回True;
    }
    
    我在想的另一件事是另一个concurrentDictionary,它将为每个用户提供锁对象,我们将对更新时间戳进行双重检查锁定


    如有任何意见,将不胜感激。谢谢

    有许多可能的解决方案,使用信号量或监视器是防止多次执行的两种简单方法。请看一下在数据库中添加并发令牌。如果并发令牌不是DB中的令牌,则不要更新。Entityframework支持并发令牌并可以自动拒绝请求。@fredrik您不认为对所有用户使用单锁效率很低吗,因为user1和user2的更新可以同时进行。@johnny5不幸的是,我们不能访问数据库及其模式,我不能使用其他框架。我必须自己实现,就像重新发明轮子一样。有很多可能的解决方案,使用信号量或监视器是防止多次执行的两种简单方法。请看一下在数据库中添加并发令牌。如果并发令牌不是DB中的令牌,则不要更新。Entityframework支持并发令牌并可以自动拒绝请求。@fredrik您不认为对所有用户使用单锁效率很低吗,因为user1和user2的更新可以同时进行。@johnny5不幸的是,我们不能访问数据库及其模式,我不能使用其他框架。我必须自己实施,就像重新发明轮子一样。