Множество потоков добавляют элементы в ConcurrentQueue, а один другой поток извлекать их и обрабатывать.
Вот функция обработки элементов:
public async Task PacketSender()
{
while (true)
{
if (PacketQueueForSend.TryDequeue(out Packet packet))
{
await packet.ClientTcp.Send(packet);
}
}
}
Добавление в эту очередь я пытался сделать так:
private async void PacketAddToQueue(Packet packet, ClientTcp receiver)
{
if (packet == null || receiver == null) return;
var empty = messageHandler.PacketQueueForSend.IsEmpty;
packet.ClientTcp = receiver;
messageHandler.PacketQueueForSend.Enqueue(packet);
if (empty)
await messageHandler.PacketSender();
}
Отсюда множественный вызов получается, а нужно чтобы только в случае если до этого очередь была пуста. Все это было придумано, чтобы в Stream одного сокета не писали несколько потоков, а не деле идея не додумана. Если есть способ проще, то просьба рассказать мне о нем.
CompleteAddingConsumerбольше не будет ждать появления нового элемента, а просто завершит цикл – VladD Apr 30 '17 at 21:43CompleteAddingраньше времени :) – VladD Apr 30 '17 at 21:47