Служба Windows - определенно лучший способ. В вашем методе запуска службы вам нужно будет создать необходимые FileSystemWatcher
экземпляры.
Когда создаются новые файлы, события будут запускаться, и вам придется своевременно обрабатывать эти события. Событие выполняется в потоке из пула потоков, и будущие события могут быть потеряны, если ваш обработчик событий не вернется немедленно. Это означает, что вам придется поставить в очередь какую-то задачу. Вы можете использовать новое в .NET 4 Task Parallel Library , a BackgroundWorker class
, ThreadPool.QueueUserWorkItem method
или что-то подобное. Как правило, все эти методы используют пул потоков .NET, размер которого ограничен, чтобы ограничить объем системных ресурсов, которые будет использовать ваша служба.
Постановка в очередь новой задачи каждый раз, когда создается новый файл, позволит задачам выполняться параллельно. Если вы хотите, чтобы одновременно выполнялась только одна задача, вам придется поместить задачи в очередь. Вы можете использовать энергозависимую очередь в памяти, но другой подход - использовать долговременную и транзакционную очередь MSMQ. Если файлы достаточно малы для хранения в очереди, вы можете прочитать, поставить в очередь и удалить файл транзакционным способом. Затем другая задача должна будет удалить файлы из очереди и обработать их. Любой сбой откатит транзакцию и сохранит файл в очереди. Это позволит обойти проблемы, связанные с попыткой использования файловой системы в качестве транзакционной базы данных.
Если ваши файлы поступают в быстром темпе, вам придется справиться с ситуацией, когда события из FileSystemWatcher
пропускаются. Подход, при котором служба с регулярными интервалами (скажем, раз в минуту) сканирует файловую систему, может работать лучше для вас. Это можно сделать с помощью класса таймера (либо System.Timers.Timer
class , либо System.Threading.Timer
class ).
Во время запуска вашей службе придется перечислять существующие, но необработанные файлы и ставить их в очередь для обработки.
Если ваша служба должна быть очень надежной, вы должны учитывать все возможные сценарии сбоя, например, неожиданная остановка службы или переполнение диска.