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);