C# 信号器连接映射添加方法说明

C# 信号器连接映射添加方法说明,c#,dictionary,signalr,C#,Dictionary,Signalr,我正在使用SignalR 2.2x并实现内存中的连接映射,正如Mircosoft所解释的那样 我很难理解一段特定的代码。我理解其目的是将所有连接映射到用户,但在Add方法中除外 public void Add(T key, string connectionId) { lock (_connections) { HashSet<string> connections; if (!_connecti

我正在使用SignalR 2.2x并实现内存中的连接映射,正如Mircosoft所解释的那样

我很难理解一段特定的代码。我理解其目的是将所有连接映射到用户,但在Add方法中除外

public void Add(T key, string connectionId)
    {
        lock (_connections)
        {
            HashSet<string> connections;
            if (!_connections.TryGetValue(key, out connections))
            {
                connections = new HashSet<string>();
                _connections.Add(key, connections);
            }

            lock (connections)
            {
                connections.Add(connectionId);
            }
        }
    }
public void添加(T键,字符串连接ID)
{
锁定(_连接)
{
哈希集连接;
if(!\u connections.TryGetValue(键,输出连接))
{
连接=新的HashSet();
_连接。添加(键,连接);
}
锁(连接)
{
connections.Add(connectionId);
}
}
}
创建局部变量连接,然后如果字典中的TryGetValue为null,则为连接分配一个新的哈希集,并将其添加到指定键的字典中,然后退出if语句,否则将使用分配给键的任何内容填充它


那么,为什么connections.Add(connectionId)可以影响字典中已有项的值,而不直接访问字典

存在
\u connections.TryGetValue
。如果成功,它将返回给定键的
连接
,作为
输出
参数。如果为false,将创建一个新的
HashSet
,并将其添加到字典中。在第二次
锁定之前
您有一个对有效
连接的引用
(因为它已经在字典中并被检索到,或者因为它刚刚被添加),您可以向它添加一个新连接