Ich versuche, Code mit Dictionary neu zu schreiben, um ConcurrentDictionary zu verwenden. Ich habe einige Beispiele überprüft, habe jedoch immer noch Probleme bei der Implementierung der AddOrUpdate-Funktion. Dies ist der Originalcode:
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;
Ich weiß nicht, was ich für den Update-Teil hinzufügen soll:
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
Alle Hinweise wäre dankbar.
c#
concurrent-collections
user438331
quelle
quelle
Ich hoffe, dass ich in Ihrer Frage nichts verpasst habe, aber warum nicht einfach so? Es ist einfacher, atomar und threadsicher (siehe unten).
(Siehe: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
Der Indexer ist auch atomar. Wenn Sie stattdessen eine Funktion übergeben, ist dies möglicherweise nicht:
Siehe: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
quelle
Am Ende habe ich eine Erweiterungsmethode implementiert:
quelle
Für diejenigen, die daran interessiert sind, implementiere ich derzeit einen Fall, der ein großartiges Beispiel für die Verwendung des "alten Werts" oder des vorhandenen Werts ist, anstatt einen neuen zu erzwingen (persönlich mag ich den Begriff "alter Wert" nicht, da dies nicht der Fall ist alt, als es erst vor wenigen Prozessor-Ticks innerhalb eines parallelen Threads erstellt wurde).
quelle
GetOrAdd()
stattdessen msdn.microsoft.com/en-us/library/ee378674(v=vs.110).aspx