Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 17
1
.NET 4.x

Параллельная обработка очереди файлов

08.06.2015, 09:43. Показов 1898. Ответов 3
Метки нет (Все метки)

Добрый день!
Подскажите пожалуйста, каким образом лучше решить следующую задачу:

Имеется папка, в которой периодически будут появляться файлы от внешней системы. Необходимо осуществлять параллельную обработку поступающих файлов. Та часть программы, которая выполняет обработку файла, уже написана, работает. Хотелось бы знать, как организовать очередь файлов (желательно "отсортированную" по времени "прилета" файлов), и параллельную обработку файлов из этой очереди.

Буду очень благодарна за приведение хотя бы примерной реализации, так как до этого не приходилось работать с потоками или чем-то подобным.

Заранее спасибо.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.06.2015, 09:43
Ответы с готовыми решениями:

Параллельная обработка нескольких файлов в потоках, обрабатывается только последний
Добрый день! У меня следующая задача. Мне необходимо конвертировать бинарные файлы в нормальный...

Параллельная обработка данных
Здравствуйте) Помогите найти суть проблемы. У меня реализован класс поставщик/потребитель для...

Параллельная загрузка файлов
Добрый день! Продолжение вот этой темы. На примере несложного парсера разбираюсь с работой...

Параллельная обработка изображений
Добрый день, на данный момент начал изучение темы параллельных вычислений. Написал простую...

3
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
08.06.2015, 10:14 2
Здравствуйте!

Вам для этого потребуется три вещи:
1. FileSystemWatcher
2. BlockingCollection
3. Параллельная обработка очереди

Минимальный пример:
C#
1
2
3
4
5
var queue = new BlockingCollection<string>();
var fsw = new FileSystemWatcher(@"путь\к\папке\");
fsw.Created += (o, e) => queue.Add(e.FullPath);
fsw.EnableRaisingEvents = true;
Parallel.ForEach(queue.GetConsumingEnumerable(), ConsumePath);
C#
1
2
3
4
void ConsumePath(string path)
{
   // Код обработки файла
}
Добавлено через 1 минуту
При завершении работы установите свойство fsw.EnableRaisingEvents на False и вызовите метод CompleteAdding на queue — это прекратит мониторинг папки, а запущенные потоки закончат обрабатывать файлы, оставшиеся в очереди, после чего схлопнутся.
3
0 / 0 / 0
Регистрация: 15.05.2015
Сообщений: 17
08.06.2015, 11:22  [ТС] 3
kolorotur,
Подскажите, пожалуйста,
1. как ограничить количество потоков при такой реализации?
2. не возникнет ли ошибки, если файл еще не полностью скопировался в директорию, на которую смотрит FileSystemWatcher, а следующая команда
C#
1
fsw.Created += (o, e) => queue.Add(e.FullPath);
попытается поместить его в очередь?
0
Эксперт .NET
15555 / 11804 / 3097
Регистрация: 17.09.2011
Сообщений: 19,718
08.06.2015, 13:06 4
Цитата Сообщение от miracle_ekb Посмотреть сообщение
1. как ограничить количество потоков при такой реализации?
Одна из перегрузок метода ForEach принимает ссылку на ParallelOptions, в экземпляре которого можно установить свойство MaxDegreeOfParallelism на нужное.
Но я выше написал, что это всего лишь минимальный пример — никто не заставляет использовать TPL для этих целей.

Цитата Сообщение от miracle_ekb Посмотреть сообщение
не возникнет ли ошибки, если файл еще не полностью скопировался в директорию, на которую смотрит FileSystemWatcher, а следующая команда попытается поместить его в очередь?
В очередь помещается не файл, а только путь к файлу.
А ошибка уже может возникнуть, когда вы извлечете этот путь из очереди и попытаетесь сделать что-то с данным файлом.
Но правильная работа с файлами, которыми могут пользоваться другие процессы — это уже отдельная тема, к данной имеющая весьма опосредованное отношение.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.06.2015, 13:06

Параллельная обработка файлов
Не понимаю как организовать параллельную обработку файлов в данной программе. Смысл в том что есть...

Параллельная обработка файлов
Здравствуйте. Подскажите пожалуйста как на с++ реализовать обработку файлов параллельно в несколько...

Обработка файлов по очереди
Добрый день! Есть рабочий скрип, но есть проблема. Он считывает все файлы в папке и потом...

Параллельная обработка
Добрый день! Подскажите, пожалуйста, как параллельно считать содержимое всех файлов из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru