Задача многопоточного архивирования файлов. Элементы в очереди не по порядку - C#

Узнай цену своей работы

Формулировка задачи:

Поставлена задача многопоточного архивирования файлов. Есть 3 метода:
  1. Считать Из Файла Блок Данных и Добавить в Очередь На Сжатие,
  2. Взять блок из очереди, сжать его и добавить во вторую очередь на запись в файл
  3. Взять блок из второй очереди и записать его в файл
Для считывания и записи блоков я выделяю по одному потоку. Проблема начинается, когда я выделяю на метод сжатия несколько потоков - блоки приходят во вторую очередь не в том порядке, в котором были считаны из первой. Оно и понятно. Возможным решением я считаю маркировку блока при чтении файла и постановке его в первую очередь. проблема в том, как во втором методе запихивать блоки во вторую очередь. Интересует сама конструкция: если (номер блока на один больше предыдущего) {то добавляю очередь;} иначе { "как???"} Хочу подчеркнуть, что потоков много.

Решение задачи: «Задача многопоточного архивирования файлов. Элементы в очереди не по порядку»

textual
Листинг программы
                static void ProcessFile(string inputPath, string outputPath)
        {
            var inputLines = new BlockingCollection<string>();
            var processedLines = new BlockingCollection<string>();
            // Stage #1
            var readLines = Task.Factory.StartNew(() =>
            {
                try
                {
                    foreach (var line in File.ReadLines(inputPath))
                    {
                        inputLines.Add(line);
                    }
                }
                finally { inputLines.CompleteAdding(); }
            });
            // Stage #2
            var processLines = Task.Factory.StartNew(() =>
            {
                try
                {
                    inputLines.GetConsumingEnumerable().AsParallel().AsOrdered().ForAll(x=>processedLines.Add(x));
                }
                finally { processedLines.CompleteAdding(); }
            });
            // Stage #3
            var writeLines = Task.Factory.StartNew(() =>
            {
                File.WriteAllLines(outputPath, processedLines.GetConsumingEnumerable());
            });
            Task.WaitAll(readLines, processLines, writeLines);
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5
Похожие ответы