Я пытаюсь переписать код с помощью Dictionary, чтобы использовать ConcurrentDictionary. Я просмотрел несколько примеров, но у меня все еще возникают проблемы с реализацией функции AddOrUpdate. Это исходный код:
dynamic a = HttpContext;
Dictionary<int, string> userDic = this.HttpContext.Application["UserSessionList"] as Dictionary<int, String>;
if (userDic != null)
{
if (useDic.ContainsKey(authUser.UserId))
{
userDic.Remove(authUser.UserId);
}
}
else
{
userDic = new Dictionary<int,string>();
}
userDic.Add(authUser.UserId, a.Session.SessionID.ToString());
this.HttpContext.Application["UserDic"] = userDic;
Я не знаю, что добавить в обновленную часть:
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
Любые указатели будут оценены.
c#
concurrent-collections
user438331
источник
источник
Надеюсь, я ничего не упустил в вашем вопросе, но почему бы просто не так? Это проще, атомарнее и потокобезопасно (см. Ниже).
(См .: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
Индексатор тоже атомарный. Если вместо этого вы передадите функцию, ее может не быть:
См. Http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
источник
В итоге я реализовал метод расширения:
источник
Для тех, кому интересно, я в настоящее время реализую случай, который является отличным примером использования "oldValue", известного как существующее значение, вместо того, чтобы форсировать новое (лично мне не нравится термин "oldValue", поскольку это не старый, когда он был создан всего несколько тактов назад из параллельного потока).
источник
GetOrAdd()
вместо этого msdn.microsoft.com/en-us/library/ee378674(v=vs.110).aspx