ConcurrentDictionary 添加数据
ConcurrentDictionary Add Data
现在,在我的项目中,我必须将来自不同 IP 地址的数据写入单独的列表。我在如何按什么顺序记录方面遇到问题。
连接数可以为500个,用户可以随意关闭和打开连接。如果他关闭连接,则不应为该列表进行注册。
例如; ip地址192.168.1.20 - 192.168.1.30 - 192.168.1.40是三个连接。我知道数据来自哪个IP地址,但我无法控制我应该将数据写入哪个列表。
我有 3 个名为 Log_1 Log_2 Log_3 的列表。在打开连接的情况下,我可以分别记录。当他关闭第二个连接然后重新连接时,队列将被移动,这将使我的管理变得困难。我怎样才能摆脱这种情况?
总结一下;我需要将每个 ip 的数据保存在单独的列表中。它必须能够支持最多 500 个连接。
我使用了“ConcurrentDictionary”,但当数据来自同一个键时,ConcurrentDictionary 不会添加。有其他选择吗?还是我哪里弄错了。
我的代码
ConcurrentDictionary<string, Queue<byte[]>> FullData = new ConcurrentDictionary<string, Queue<byte[]>>();
数据接收代码
byte[] Data = e.Data;
FullData.TryAdd(e.IpPort, Data);
您可以像这样访问 Queue
FullData[e.IpPort]
并将新值添加到您的队列中。
if (!FullData.ContainsKey(e.IpPort))
FullData.TryAdd(e.IpPort, new ConcurrentQueue<byte[]>());
byte[] Data = e.Data;
FullData[e.IpPort].Enqueue(Data);
您还应该在非线程安全上下文中使用 ConcurrentQueue。
您想将 Data
添加到由 e.IpPort
键入的 Queue
。使用 FullData.GetOrAdd
方法检索队列。如果找不到键,这将向字典添加一个新队列(通过提供的表达式):
var queue = FullData.GetOrAdd(e.IpPort, (key) => new Queue<byte[]>(...));
queue.Enqueue(Data);
现在,在我的项目中,我必须将来自不同 IP 地址的数据写入单独的列表。我在如何按什么顺序记录方面遇到问题。
连接数可以为500个,用户可以随意关闭和打开连接。如果他关闭连接,则不应为该列表进行注册。
例如; ip地址192.168.1.20 - 192.168.1.30 - 192.168.1.40是三个连接。我知道数据来自哪个IP地址,但我无法控制我应该将数据写入哪个列表。
我有 3 个名为 Log_1 Log_2 Log_3 的列表。在打开连接的情况下,我可以分别记录。当他关闭第二个连接然后重新连接时,队列将被移动,这将使我的管理变得困难。我怎样才能摆脱这种情况?
总结一下;我需要将每个 ip 的数据保存在单独的列表中。它必须能够支持最多 500 个连接。
我使用了“ConcurrentDictionary”,但当数据来自同一个键时,ConcurrentDictionary 不会添加。有其他选择吗?还是我哪里弄错了。
我的代码
ConcurrentDictionary<string, Queue<byte[]>> FullData = new ConcurrentDictionary<string, Queue<byte[]>>();
数据接收代码
byte[] Data = e.Data;
FullData.TryAdd(e.IpPort, Data);
您可以像这样访问 Queue
FullData[e.IpPort]
并将新值添加到您的队列中。
if (!FullData.ContainsKey(e.IpPort))
FullData.TryAdd(e.IpPort, new ConcurrentQueue<byte[]>());
byte[] Data = e.Data;
FullData[e.IpPort].Enqueue(Data);
您还应该在非线程安全上下文中使用 ConcurrentQueue。
您想将 Data
添加到由 e.IpPort
键入的 Queue
。使用 FullData.GetOrAdd
方法检索队列。如果找不到键,这将向字典添加一个新队列(通过提供的表达式):
var queue = FullData.GetOrAdd(e.IpPort, (key) => new Queue<byte[]>(...));
queue.Enqueue(Data);