Как отсортировать ConcurrentBag? - PullRequest
0 голосов
/ 02 мая 2018

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

У кого-нибудь есть предложения для меня?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...