Зацикливание потока и ожидание сообщений из буфера - лучшее решение
У меня есть конкретная проблема, я хочу иметь один отдельный рабочий поток, который в некоторые периоды контролирует, если буфер не пуст. Если это не так, поток отправляет данные из буфера (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 должен соответствовать вашим потребностям. Вы можете также найти этот учебник интересным для чтения.