Зацикливание потока и ожидание сообщений из буфера - лучшее решение

У меня есть конкретная проблема, я хочу иметь один отдельный рабочий поток, который в некоторые периоды контролирует, если буфер не пуст. Если это не так, поток отправляет данные из буфера (ConcurrentQueue) ... Есть ли хорошее решение, которое не слишком дорого для процессора?

Вот мой метод, он работает, но, возможно, не очень хорошо (на самом деле я не очень понимаю синхронизацию потоков).

public void start(object timeout){

            //Message - my own objective implementation of some tcp message
            Message m;
            while (true) {
                if (msgBuffer.Count != 0) {
                    if (msgBuffer.TryDequeue(out m)) {
                        client.SendData(MediatorPacket.GetPacketBytes(m));
                        SpinWait.SpinUntil(() => { if (msgBuffer.Count != 0) return true; else return false; });
                    }
                }
            }
        }*/

2 ответа

Решение

Похоже, вы ищете производителя-потребителя с блокирующим поведением (т.е. потребитель будет блокироваться и не будет планироваться, пока в буфере не будет данных). В этом случае взгляните на BlockingCollection.

Абсолютно. Взгляните на библиотеку TPL DataFlow. В частности, BufferBlock должен соответствовать вашим потребностям. Вы можете также найти этот учебник интересным для чтения.

Другие вопросы по тегам