SignalR ConnectionMapping添加方法说明

时间:2017-04-03 14:03:52

标签: c# dictionary signalr

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

我无法理解特定的代码块。我理解的目的是将所有连接映射到用户,但是在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);
            }
        }
    }

创建局部变量 connections ,然后如果Dictionary中的TryGetValue为null,则为 connections 分配一个新的HashSet并将其添加到指定的Dictionary中键然后走出if语句,否则它将填充分配给键的任何内容。

为什么 connections.Add(connectionId)可以影响已经在词典中的项目的值,而不会直接访问词典

1 个答案:

答案 0 :(得分:0)

_connections.TryGetValue。如果成功,您将返回给定密钥的connections作为out参数。如果为false,则创建新的HashSet并将其添加到字典中。在第二个lock之前,您有一个对有效connections的引用(因为它已经在字典中并且已被检索或因为它刚刚被添加),您可以只添加一个新连接。