如何对ConcurrentBag进行排序?

时间:2018-05-02 19:53:20

标签: c# concurrency

我正在研究客户端/服务器应用程序。服务器向客户端发送消息,但无法保证订单。我正在使用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

有人对我有建议吗?

0 个答案:

没有答案