我正在使用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)可以影响已经在词典中的项目的值,而不会直接访问词典
答案 0 :(得分:0)
有_connections.TryGetValue
。如果成功,您将返回给定密钥的connections
作为out
参数。如果为false,则创建新的HashSet
并将其添加到字典中。在第二个lock
之前,您有一个对有效connections
的引用(因为它已经在字典中并且已被检索或因为它刚刚被添加),您可以只添加一个新连接。