0

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

Adrug
  • 1,301
  • Вы случайно не producer/consumer заново изобретаете? – VladD Apr 30 '17 at 20:22
  • Именно то что нужно. Если говорить относительно первого ответа про BlockingCollection. Получается мне нужно запустить свой аналогичный метод Consumer в отдельном потоке и он будет в бесконечном режиме ждать пока в коллекции что-то появится? А потокам, которые добавляют в коллекцию элементы не запрещать в него добавление? – Adrug Apr 30 '17 at 21:02
  • Именно так, он будет ждать добавления. Можно, кстати, и несколько параллельных Consumer'ов. – VladD Apr 30 '17 at 21:24
  • «А потокам, которые добавляют в коллекцию элементы не запрещать в него добавление?» — вот этого не понял – VladD Apr 30 '17 at 21:24
  • Вот этим CompleteAdding, так понял, что после нее коллекция становится ReadOnly и нужно будет создать новый экземпляр BlockingCollection. Насчет параллельных Consumer'ов, сейчас так и получается, что обработчиков очереди становится много. – Adrug Apr 30 '17 at 21:36
  • Насколько я понимаю, главное, что после CompleteAdding Consumer больше не будет ждать появления нового элемента, а просто завершит цикл – VladD Apr 30 '17 at 21:43
  • Вот! Мне этого не нужно. – Adrug Apr 30 '17 at 21:44
  • Тогда не вызывайте CompleteAdding раньше времени :) – VladD Apr 30 '17 at 21:47

0 Answers0