【问题标题】:ConcurrentDictionary - AddOrUpdate issueConcurrentDictionary - AddOrUpdate 问题
【发布时间】:2015-01-30 08:30:59
【问题描述】:

我正在使用下面的代码尝试根据字典对象的键更新字典对象中的值。

public static ConcurrentDictionary<string, SingleUserStatisticsViewModel> UsersViewModel = new ConcurrentDictionary<string, SingleUserStatisticsViewModel>();

var userSession = new UserSessionStatistic()
{
    Id = "12345", Browser = "Netscape"
};
var userViewModel = new SingleUserStatisticsViewModel()
{
    UserSessionStatistic = userSession,
    StartTime = DateTime.Now
};

//第一次添加

MyStaticClass.UsersViewModel.AddOrUpdate(userViewModel.UserSessionStatistic.Id, userViewModel, (key, model) => model);

//尝试更新

        var userSession2 = new UserSessionStatistic()
        {
            Id = "12345",
            Browser = "not getting updated????"
        };
        var userViewModel2 = new SingleUserStatisticsViewModel()
        {
            UserSessionStatistic = userSession2,
            StartTime = DateTime.Now
        };

MyStaticClass.UsersViewModel.AddOrUpdate(userViewModel2.UserSessionStatistic.Id, userViewModel2, (key, model) => model);

但是 userViewModel2 中的 UsersessionStatistic 对象没有在 ConcurrentDictionary 中更新(它的浏览器属性仍然显示 "Netscape"),我做错了什么?

【问题讨论】:

  • 您确定要添加到同一个 ConcurrentDictionary 吗? (因为 MyStaticClass != SignalRStatic)。看到你的代码,它应该可以工作......
  • @Sharped 。是的,我 100% 确定它是相同的 ConcurrentDictionary
  • @Sharped。哦,对不起,这只是一个错字。我修好了
  • 好的,这是因为 lambda。 lambda 将旧值作为参数传递 => (key, oldValue) => oldValue

标签: c# concurrentdictionary


【解决方案1】:

关于价值工厂,the docs say

updateValueFactory 类型:System.Func 用于为现有键生成新值的函数 键的现有值

这意味着您将现有值传递给它。你需要用新的来更新它:

MyStaticClass.UsersViewModel.AddOrUpdate(userViewModel2.UserSessionStatistic.Id,
                                         userViewModel2, 
                                         (key, oldModel) => userViewModel2);

【讨论】:

    猜你喜欢
    • 2012-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多