Многопоточная обработка мелких файлов - C#

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

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

Добрый день! Программа через ThreadPool обрабатывает массив файлов:
   foreach (string file in Files)
                {
                    ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file);
                }
Метод Check() читает файл, делает различные проверки, в конце - пишет результаты в таблицу. Я заметил, что если программа обрабатывает крупные файлы (средним объемом 50 Мб), то скорость работы получается максимально высокой. Если программа обрабатывает мелкие файлы (по 1 Мб), то скорость обработки падает в несколько раз. Как считаете, можно ли как-то ускорить обработку мелких файлов, не меняя коренным образом программу?
Я так понял, что основные затраты состоят в том, что: - на каждый файл создается отдельный поток; - в методе check() ведется некая подготовка для чтения файла - вывод результатов в DataGridView происходит чаще, если если обрабатывать крупные файлы.
В Parallel.ForEach есть такая штука встроенная "Partitioner". Она позволяет не создавать отдельный поток для каждого файла, а создавать один поток, а потом направлять в него некую "порцию" файлов. Таким образом, более эффективно распределяя нагрузку. Я, вот, думаю, можно ли для ThreadPool что-то подобное сделать.
Думаю, как бы в качестве объекта в строку ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)file); передавать не один (object)file, а, скажем массив, состоящий из нескольких файлов общим объемом не менее 50 Мб. Если же какой-то файл сразу больше 50 Мб, то передавать только один файл в массиве.

Решение задачи: «Многопоточная обработка мелких файлов»

textual
Листинг программы
ThreadPool.QueueUserWorkItem(new WaitCallback(Check), (object)sb);
            Thread.Sleep(10);

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


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

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

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