Estou tentando reescrever algum código usando o Dicionário para usar o ConcurrentDictionary. Eu revisei alguns exemplos, mas ainda estou tendo problemas para implementar a função AddOrUpdate. Este é o código 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;
Não sei o que adicionar para a parte de atualização:
userDic.AddOrUpdate(authUser.UserId,
a.Session.SessionID.ToString(),
/*** what to add here? ***/);
Quaisquer sugestões serão apreciadas.
c#
concurrent-collections
user438331
fonte
fonte
Espero não ter perdido nada na sua pergunta, mas por que não assim? É mais fácil, atômico e thread-safe (veja abaixo).
(Consulte: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx )
O indexador também é atômico. Se você passar uma função, pode não ser:
Veja: http://blogs.msdn.com/b/pfxteam/archive/2010/01/08/9945809.aspx
fonte
Acabei implementando um método de extensão:
fonte
Para aqueles que estão interessados em, atualmente estou implementando um caso que é um ótimo exemplo para usar o valor "oldValue" também conhecido como valor existente em vez de forçar um novo (pessoalmente, não gosto do termo "oldValue" porque não é esse antigo quando foi criado há apenas alguns cliques do processador em um thread paralelo).
fonte
GetOrAdd()
em vez msdn.microsoft.com/en-us/library/ee378674(v=vs.110).aspx