Как мне написать службу Windows, которая опрашивает каталог для новых файлов? - PullRequest
0 голосов
/ 04 мая 2009

Я создал оконную службу, она в основном читает временный файл на моей машине, читает его в базе данных и затем удаляет его. Я написал код для этих действий в методе onStart, поэтому мне нужно перезапустить службу, когда она мне понадобится, но на самом деле мне нужно, чтобы служба автоматически распознала создание файла в моей папке. а затем работать над этим.

Так, где я должен поместить этот конкретный код в мой сервис Windows?

Ответы [ 5 ]

5 голосов
/ 04 мая 2009

Поскольку FileSystemWatcher не гарантирует уведомления обо всех изменениях файловой системы, я бы рекомендовал опрашивать его, используя Таймер с установленным интервалом. Этот подход проще и для системных ресурсов.

Внутренне, FSW буферизирует события, полученные из файловой системы. Если одновременно происходит слишком много событий, этот буфер переполнится, и вы начнете терять события. Если ваш код обработчика событий не завершится очень быстро или вы не используете какой-либо механизм организации очередей, вы также начнете терять события. ИМО, это делает ЖКС менее чем на 100% надежным подходом.

Вот статья, в которой более подробно обсуждается FSW против производительности .

Примечание к системному ресурсу: FSW полагается на регистрацию обратного вызова в файловой системе ОС. У меня нет метрик на то, сколько это приходится на системные ресурсы. Мое предложение использовать таймер для активного опроса системы не требует таких ресурсов от файловой системы. Вы можете опрашивать файловую систему каждые 30 секунд или каждые 5 минут, в зависимости от того, насколько быстро вам нужно получить файлы.

Если вам действительно не нужно поведение, близкое к реальному, то есть ...

4 голосов
/ 04 мая 2009
2 голосов
/ 04 мая 2009

Может быть, комбинированный подход может быть полезным? Объединение таймера и наблюдателя файловой системы.

Использование временного расширения при записи в файл и переименование в случае готовности также может быть полезно для предотвращения чтения файла при записи в него.

0 голосов
/ 15 июня 2009

Я недавно создал что-то, что почти точно то, что вы описываете. Сначала я подумал, что мне следует использовать FileSystemWatcher. Проблема в том, что он только уведомил меня о том, что произошло. Если служба не работала и должна была быть перезапущена по какой-либо причине, при запуске она не запускала никаких событий, связанных с файлами, которые были созданы, когда служба не работала.

Итак, я начал писать собственный опросчик, который проверял бы файлы при запуске службы, а затем использовал FileSystemWatcher. Затем я начал думать, зачем вообще возиться с FileSystemWatcher и иметь 2 кода для обслуживания? Таким образом, я полностью отбросил его и просто сделал так, чтобы мой поллер делал все это, поскольку приложение просто должно делать то, что поллер делал при запуске снова и снова.

Мое приложение - это служба Windows. OnStart создает поток, который выполняет функцию для опроса. Эта функция является просто циклом while с конечным условием, запускаемым OnStop, и она просто опрашивает каждую минуту и ​​просматривает каталог. Если он находит что-то, он имеет дело с этим, если нет, он спит в течение 1 минуты. Довольно просто Код является базовым и простым в обслуживании.

Вот пример моего OnStart:

    protected override void OnStart(string[] args)
    {
        WriteToLog("Starting...");
        bThreadRun_m = true;

        tMain_m = new Thread(new ThreadStart(RunThread));
        tMain_m.Name = "Main Thread";
        tMain_m.Start();

        WriteToLog("Start Complete");
    }
0 голосов
/ 04 мая 2009

Независимо от того, используете ли вы таймер или FileSystemWatcher, оба будут запускать события, на которые вам нужно подписаться. Когда файл обнаружен, происходит событие. Это запускает новый поток, который выполняет ваш обработчик событий.

Следовательно, в вашем методе OnStart вам необходимо подписаться на событие. Для этого ваш обработчик событий должен быть методом, который каким-то образом доступен из вашего OnStart ().

Для справки, я несколько раз обгорел в FSW и больше его не использую, я считаю его слишком ненадежным. Я написал свой собственный класс FileWatcher, который делает то, что предлагает Peter Lillevold , и использует таймер для повторного опроса каталога. Возможно, немного грубо, но это работает. И вы не можете победить это; -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...