Я работаю над клиент-серверным приложением. Сервер отправляет сообщения клиенту, но порядок не может быть гарантирован. Я использую 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
!
У кого-нибудь есть предложения для меня?