我正在研究客户端/服务器应用程序。服务器向客户端发送消息,但无法保证订单。我正在使用TCP ...我不想了解为什么订单无法保证(这与服务器上的线程有关)。
无论如何,在客户端上,我正在处理这样的消息:
private Queue<byte[]> rawMessagesIn = new Queue<byte[]>();
public ConcurrentBag<ServerToClient> messages = new ConcurrentBag<ServerToClient>();
public void Start()
{
var processTask = Task.Factory.StartNew(() =>
{
while (run)
{
process();
}
});
}
void process(){
if(rawMessagesIn.Count > 0){
var raw_message = rawMessagesIn.Dequeue();
var message = (ServerToClient)Utils.Deserialize(raw_message);
messages.Add(message);
}
}
private void OnDataReceived(object sender, byte[] data)
{
rawMessagesIn.Enqueue(data);
}
现在,重要的是,当我致电messages.TryTake()
或messages.TryPeek()
时,消息out
是序列中的下一个消息。每条消息都有一个代表其顺序的数字/整数。例如,message.number = 1
我需要使用TryPeek
,因为索引0处的消息可能是正确的消息,或者它可能是错误消息,在这种情况下,我们从包中删除消息。但是,该消息可能是未来所需的消息,因此不应将其删除。
我尝试过使用message.OrderBy(x=>x.number).ToList();
,但我看不出它会如何运作。如果我使用OrderBy
并获得排序列表SL
并且索引0处的项目是正确的,我不能简单地删除或修改messages
因为我不知道它在ConcurrentBag
!
有人对我有建议吗?