在C#里 接收socket推送的消息,消息有messageid,如何临时存这个消息任务,考虑到线程安全,消息要去重,重复的message
时间: 2023-08-18 13:08:37 浏览: 33
id不应该存储,需要使用线程安全的数据结构来存储这些消息任务并去重。
一种解决方案是使用ConcurrentDictionary<TKey, TValue>类来存储消息任务,其中TKey为消息的messageid,TValue为消息任务的对象。ConcurrentDictionary类为多线程环境下设计的字典,可以安全地在多个线程中访问和修改。
当收到新消息时,可以先检查ConcurrentDictionary中是否存在相同messageid的消息。如果存在,则忽略该消息;否则,将该消息添加到ConcurrentDictionary中。
例如,以下是一个简单的示例代码:
```
ConcurrentDictionary<string, MessageTask> messageTasks = new ConcurrentDictionary<string, MessageTask>();
// 接收到新消息时调用该方法
public void OnReceiveMessage(string messageId, string messageContent)
{
if (!messageTasks.ContainsKey(messageId))
{
var messageTask = new MessageTask(messageId, messageContent);
messageTasks.TryAdd(messageId, messageTask);
// 处理消息任务
// ...
}
}
// 消息任务对象
public class MessageTask
{
public string MessageId { get; set; }
public string MessageContent { get; set; }
public MessageTask(string messageId, string messageContent)
{
MessageId = messageId;
MessageContent = messageContent;
}
}
```
在这个例子中,当接收到新消息时,先检查ConcurrentDictionary中是否已经存在相同messageid的消息,如果不存在,则创建一个新的MessageTask对象,并将其添加到ConcurrentDictionary中。如果存在,则忽略该消息。这样可以避免重复消息的处理,并确保线程安全。