-2

есть метод, уже третий день ломаю голову, как мне переделать его под .net3.5 Библиотеками пользоваться нельзя Или может тут нужно другое решение.

ConcurrentQueue<KeyValuePair<int, byte[]>> queue_block = new ConcurrentQueue<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);
            while (queue_block.Count > 100) 
            {
                var t = Task.Run(async delegate
                {
                    await Task.Delay(1000);
                    return 42;
                });
                t.Wait();
            }
        }
    }
  • так а что не получается то? – tym32167 Aug 02 '18 at 11:16
  • @tym32167 Этот код не работает под 3,5, и как его поправить вот ломаю голову, суть в том, чтобы защищать очередь от переполнения, async не работает в 3,5 – Vladimr Vladimirovoch Aug 02 '18 at 11:23
  • https://habr.com/post/179381/ ? – tym32167 Aug 02 '18 at 11:29
  • @tym32167 да это интересно, но по условию задачи нельзя использовать никакие сторонние библиотеки – Vladimr Vladimirovoch Aug 02 '18 at 11:35
  • в показанной вами задача создается таск, который ничего полезного не делает, и при этом он на секунду блокирует поток. Вы с таким же успехом можете вырезать таск, выкинуть async\await, и заменить Task.Delay на Thread.Sleep - получите примерно то же самое – tym32167 Aug 02 '18 at 11:37
  • @tym32167 А пример покажите пожалуйста, и еще вопрос попутно, а как себя будет вести fs это поток FileStream – Vladimr Vladimirovoch Aug 02 '18 at 11:41
  • 3
    Скажите, а когда вы собеседование пройдете - свою работу вы тоже на этот сайт будете выкладывать? – Pavel Mayorov Aug 02 '18 at 11:42
  • @PavelMayorov задачу делаю для себя, а не для собеседования с целью понять некоторые моменты, вот их я и пытаюсь спросить. Задача интересная и гораздо сложнее чем Hellow World – Vladimr Vladimirovoch Aug 02 '18 at 11:44
  • @PavelMayorov хха, а я то думаю, отчего юзер, что только что producer-consumer реализовал спрашивает такие простые вещи :) – tym32167 Aug 02 '18 at 11:45
  • @PavelMayorov до собеседования мне еще далеко, потому не судите строго,я пытаюсь уже практически что то делать. – Vladimr Vladimirovoch Aug 02 '18 at 11:46
  • @VladimrVladimirovoch тогда начните с того что разберите "свой" код, выяснив что делает каждая строчка. Тогда и вопросов будет меньше... – Pavel Mayorov Aug 02 '18 at 11:47
  • @PavelMayorov к своему коду, как раз вопросов нет, я сам его писал и знаю, что каждая строчка делает. Вопрос сейчас в том, что памяти много используется,практически вся, это неправильно, и по логике я понимаю, что нужно ограничить очередь, где хранятся блоки прочитанные, я инструментально пока не могу понять как мне это сделать.Если файл 600 мб, то и очередь тоже в памяти разрастается на 600 мб – Vladimr Vladimirovoch Aug 02 '18 at 11:53
  • @VladimrVladimirovoch я вам еще прошлый раз сказал: уберите нафиг очередь. Пока вы используете Queue - вы обязаны загружать файл в память полностью, без этого никак. – Pavel Mayorov Aug 02 '18 at 11:55
  • @PavelMayorov Тогда вопрос, разве я не могу ограничить очередь максимальным значением. при достижении которого, поток ждет,пока очередь разгрузится, ведь другие потоки забирают из очереди данные все время пока в очереди есть данные. И второй момент, а тогда если не очередь, то где мне хранить куски файла,которые я буду обрабатывать. Что тогда использовать. Что будет рационально? – Vladimr Vladimirovoch Aug 02 '18 at 12:03
  • 1
    @VladimrVladimirovoch нет, не можете. Потому что Queue - это потоконебезопасная коллекция, и без внешней синхронизации другой поток не должен иметь к ней доступа пока вы читаете файл. – Pavel Mayorov Aug 02 '18 at 12:16
  • 1
    @VladimrVladimirovoch а использовать надо любую потокобезопасную очередь. В .net 4.0 это BlockingCollection, а в .net 3.5 вам придется писать ее самому. – Pavel Mayorov Aug 02 '18 at 12:17
  • @PavelMayorov вот это уже конструктивно)), если наколяю извините), Вы хотите сказать, что будь очередь потокобезопасной, я смог бы регулировать ее размер,верно я вас понял? – Vladimr Vladimirovoch Aug 02 '18 at 12:22
  • 1
    @VladimrVladimirovoch да. И еще я хочу сказать, что потокобезопасная очередь часто называется Producer-Consumer pattern. – Pavel Mayorov Aug 02 '18 at 12:23
  • @PavelMayorov тогда моя ошибка в том, что я использую две очереди, для хранения необработанных блоков и обработанных блоков, получается, что лучше мне брать сразу блок и в виде задачи, взять блок-сжать-записать в файл, отправлять воркерам. – Vladimr Vladimirovoch Aug 02 '18 at 12:35
  • @PavelMayorov Спасибо за подсказку, реализовал я программку жмет файлы, 12500 гб за 11 минут, Только теперь не знаю как мне попробовать это все оптимизировать или сделать быстрее. С какой стороны подойти – Vladimr Vladimirovoch Aug 06 '18 at 13:39

1 Answers1

2

так как таск ничего не делает и ожидается синхронно, его можно заменить на

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);
        while (queue_block.Count > 100)
        {           
            Thread.Sleep(1000);         
        }
    }
}
tym32167
  • 32,857