gpt4 book ai didi

c# - 删除和添加多个项目时锁定 ConcurrentDictionary?

转载 作者:行者123 更新时间:2023-11-30 12:25:30 68 4
gpt4 key购买 nike

我在 StackOverflow 上阅读了以下文章:ConcurrentBag - Add Multiple Items?Concurrent Dictionary Correct Usage但答案对我来说仍然不明显。

我有这种情况:我在数据库中有 Leaderboard 表,我会定期更新它。为了优化服务器,我缓存了结果,所以我使用了 ConcurrentDictionary(因为有不同类型的排行榜,例如全时、3 天、7 天等...)。

这是我在更新排行榜上的代码:

        var leaderboards = business.UpdateLeaderboard(LeaderboardUpdater.LeaderboardDaySpans, LeaderboardUpdater.LeaderboardCount);
this.LastUpdateTime = now;

// The LeaderboardCache is ConcurrentDictionary<int, LeaderboardResponseViewModel>
this.LeaderboardCache.Clear();
foreach (var leaderboard in leaderboards)
{
this.LeaderboardCache.TryAdd(leaderboard.DaySpan, new LeaderboardResponseViewModel(leaderboard));
}

假设用户可以随时请求排行榜信息。所以我有一些问题:

  • 我应该使用 Concat 而不是 foreach 来确保同时添加所有项吗?
  • 即使我使用Concat,我如何确保用户不会在ClearConcat 方法中间请求?
  • 我应该应用额外的锁吗?如果是这样,我如何确保并发读取,因为可以同时读取多个?

最佳答案

您在错误的级别管理并发。显然,您想以原子方式处理字典内容,但您在项目级别同步(未成功)。

使用以下数据结构:

volatile Lazy<...> myCache = new Lazy<Dictionary<...>>(ProduceCacheValues);

当您想刷新缓存值时,创建一个新的 Lazy 并覆盖 myCache

或者,只需使用锁。对于通常足够好的低频短期操作。

需要澄清的是,无法使 ConcurrentDictionary 中的多个项目或操作成为原子。

关于c# - 删除和添加多个项目时锁定 ConcurrentDictionary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31277654/

68 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com