在我班上我有
public static ConcurrentDictionary<string, HashSet<string>> ConnectedUserConnections = new ConcurrentDictionary<string, HashSet<string>>();
添加或更新时,我应该通过以下方式更新:
ConnectedUserConnections.AddOrUpdate(userId, new HashSet<string>(), (key, existingVal) =>
{
existingVal.Add(connectionId);
return existingVal;
});
或
ConnectedUserConnections.AddOrUpdate(userId, new HashSet<string>(), (key, existingVal) =>
{
lock(ConnectedUserConnections)
{
existingVal.Add(connectionId);
return existingVal;
}
});
非常感谢所有人。
答案 0 :(得分:0)
while (true)
{
TValue oldValue;
if (TryGetValue(key, out oldValue))
//key exists, try to update
{
newValue = updateValueFactory(key, oldValue);
if (TryUpdate(key, newValue, oldValue))
TryGetValue
之前没有锁定,因此如果key
已有值,则多个线程可以到达TryGetValue
,执行它,返回true
,同时执行updateValueFactory
(您的方法)并尝试添加existingVal.Add(connectionId);
...
是的,你确实需要一个lock
。