Próbuję ponownie napisać kod za pomocą Dictionary, aby użyć ConcurrentDictionary. Przejrzałem kilka przykładów, ale nadal mam problemy z zaimplementowaniem funkcji AddOrUpdate. To jest oryginalny kod:
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;
Nie wiem, co dodać do aktualizacji:
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
Wszelkie wskazówki będą mile widziane.
c#
concurrent-collections
user438331
źródło
źródło
Mam nadzieję, że w Twoim pytaniu niczego mi nie brakowało, ale czemu nie tak po prostu? Jest łatwiejszy, atomowy i bezpieczny dla wątków (patrz poniżej).
(Patrz: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
Indeksator też jest atomowy. Jeśli zamiast tego przekażesz funkcję, może to nie być:
Zobacz: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
źródło
Skończyło się na wdrożeniu metody rozszerzenia:
źródło
Dla tych, którzy są zainteresowani, wdrażam obecnie przypadek, który jest świetnym przykładem użycia "starej wartości", czyli istniejącej wartości zamiast wymuszania nowej (osobiście nie podoba mi się termin "stara wartość", ponieważ to nie jest tak stary, kiedy został utworzony zaledwie kilka tyknięć procesora temu z równoległego wątku).
źródło
GetOrAdd()
zamiast tego msdn.microsoft.com/en-us/library/ee378674(v=vs.110).aspx