0

Подскажите как правильно организовать защиту от переполнения очереди, суть в том чтобы очередь не кушала всю память при работе метода. Вот метод, в котором я прочитав блоки данных из файла добавляю их в очередь. Read_Blockk(fs) это метод, который разбивает файл на куски и читает их. Идея такая, как бы сделать так, чтобы в этом методе проверялась полнота очереди и если очередь полная то метод бы замирал, или поток в котором метод работает замирал до тех пор, пока очередь не станет свободной или в очереди не появится свободное место.Замысел такой, чтобы очередь не росла в размерах и не использовала всю память. Может есть эффективнее механизмы.

// создаем очередь c блоками данных
Queue<KeyValuePair<int, byte[]>> queue_block = new Queue<KeyValuePair<int, byte[]>>(); 

// добавляем в очередь считанные блоки  
public static void ADD_Block_to_Queue(Queue<KeyValuePair<int,byte[]>> queue_block,Stream fs)
{
    foreach (KeyValuePair<int, byte[]> block in Read_Blockk(fs))
    {
        queue_block.Enqueue(block);
    }
}
4per
  • 2,696
  • https://ru.stackoverflow.com/q/428327/178779 – Pavel Mayorov Aug 01 '18 at 09:07
  • В вопросе по ссылке есть что-то похожее, только с защитой от исчерпания очереди, а не от переполнения. – Pavel Mayorov Aug 01 '18 at 09:11
  • @PavelMayorov Мне нужно, чтобы очередь не была полной и не росла в памяти, я ее хочу ограничить, а в вашей ссылке идет реализация ограничения очереди в Producer-Consumer, а у меня просто очередь с данными, и мне нужно как то научить метод, который добавляет данные в очередь, следить за полнотой очереди. – Vladimr Vladimirovoch Aug 01 '18 at 09:30
  • Возьмите ActionBlock из Dataflow, и не изобретайте велосипед, размер очереди там параметром можно задать – Primus Singularis Aug 01 '18 at 09:35
  • @PrimusSingularis я не могу использовать Dataflow, по условиям задачи, и нужно , чтобы все работало на .net 3,5 – Vladimr Vladimirovoch Aug 01 '18 at 09:38
  • @VladimrVladimirovoch в рамках простой очереди это невозможно. Метод же не может завершить свою работу раньше чем все прочитает. Или может? Если может - просто пишите return – Pavel Mayorov Aug 01 '18 at 10:34
  • @PavelMayorov Сейчас этот метод работает в основном потоке, или мне создать, поток отдельный для этого метода, ну вот пробовал не работает. Остальные потоки которые обрабатывают данные организованы через Producer Consumer – Vladimr Vladimirovoch Aug 01 '18 at 10:47
  • @PavelMayorov сама моя программка вот ссылка – Vladimr Vladimirovoch Aug 01 '18 at 10:52

0 Answers0