J'essaie de réécrire du code en utilisant Dictionary pour utiliser ConcurrentDictionary. J'ai passé en revue quelques exemples mais j'ai toujours du mal à implémenter la fonction AddOrUpdate. Voici le code original:
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;
Je ne sais pas quoi ajouter pour la partie mise à jour:
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
Tous les pointeurs seraient appréciés.
c#
concurrent-collections
user438331
la source
la source
J'espère que je n'ai rien manqué dans votre question, mais pourquoi pas comme ça? C'est plus simple, atomique et thread-safe (voir ci-dessous).
(Voir: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
L'indexeur est également atomique. Si vous passez une fonction à la place, il se peut que ce ne soit pas:
Voir: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
la source
J'ai fini par implémenter une méthode d'extension:
la source
Pour ceux qui sont intéressés, j'implémente actuellement un cas qui est un excellent exemple pour utiliser la "oldValue" aka valeur existante au lieu d'en forcer une nouvelle (personnellement, je n'aime pas le terme "oldValue" car ce n'est pas ça ancien quand il a été créé il y a quelques temps de processeur à partir d'un thread parallèle).
la source
GetOrAdd()
place msdn.microsoft.com/en-us/library/ee378674(v=vs.110).aspx