#c_sharp #многопоточность #windows_service
Стоит задача разработать сервис, который будет использовать в качестве входа папку на локальном диске и при появлении в ней файлов, сервис должен осуществлять их парсинг, после чего полученные данные укладывать в БД. Нюанс в том, что файлы приходят "парами" (01012015.xml + 01012015.txt), и скидываются в папку круглосуточно по FTP. Разрабытываю Windows Service (C#).Пытался итеративно (каждую секунду) вызывать метод EnumerateFiles в папке, группировать их, затем парсить и полученные данные укладывать в БД. Однако в результате периодически выскакивают исключения (либо файл ещё не польностью загружен через FTP, либо к нему нет пары и т.п.). При добавлении многопоточности ошибок ещё больше. Интересует, существуют ли какие-либо готовые решения на такой случай?
Ответы
Ответ 1
У меня была аналогичная задачка. В основном потоке программы делаете интерфейс и управление. Сканирование папки с данными можно оставить в 1 служебном потоке - все равно все ограничивается "однопоточным" I/O (и соответственно только в нем решать изолированный вопрос сканирования папки). А вот укладчики в БД сделать воркерами, которых создать, например штук N и которым раздавать данные. Я бы поколдовал с попыткой открытия файла на запись (или, как подсказывают, FileAccess.Read, FileShare.Read). Пока он не загружен, ОС такого доступа к нему не даст. (тут могут быть и более правильные решения). И так же проверять парность. И только тогда добавлять файлы в список "для обработки", из которого разбирать их воркерами (с использованием крит.секции).
Комментариев нет:
Отправить комментарий