Уважаемые Гуру.Net
Подскажите плз как правильно организовать сабж.
Мне нужен сервис который перебирает файлы в определенной директории и чего-то с ними делает каждые 5 мин.
На обычном VC++ — я бы сделал так. В цикл в методе Run ставлю такой код
while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
sleep(300000);
DoSomething();
}
и все готово. Что в этом хорошо — что DoSomething выполняется синхронно.
Начал писать сервис на C#. Сразу скажу — это мой первый опыт с .net.
Ничего похожего на sleep не нашел. Зато нашел объект Timer. приаттачил к нему метод который он будет вызывать:
protected override void OnStart(string[] args)
{
aTimer = new System.Timers.Timer(100000);
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.AutoReset = false;
aTimer.Enabled = true;
}
Но насколько я понимаю — вызов будет Асинхронный — чего мне нужно избежать. (Или я чего-то недопнимаю)
Подскажите как быть. Вернее как правильно это делать на .net-e
Спасибо.
Alexander N. Treyner
Здравствуйте, sndralex, Вы писали:
S>Уважаемые Гуру.Net
S>Подскажите плз как правильно организовать сабж.
S>Мне нужен сервис который перебирает файлы в определенной директории и чего-то с ними делает каждые 5 мин.
S>На обычном VC++ — я бы сделал так. В цикл в методе Run ставлю такой код
S>S>while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
S> sleep(300000);
S> DoSomething();
S>}
S>
S>и все готово. Что в этом хорошо — что DoSomething выполняется синхронно.
S>Начал писать сервис на C#. Сразу скажу — это мой первый опыт с .net.
S>Ничего похожего на sleep не нашел. Зато нашел объект Timer. приаттачил к нему метод который он будет вызывать:
Thread.Sleep
Ed.ward
... << RSDN@Home 1.0 beta 7a >>
S>>Ничего похожего на sleep не нашел. Зато нашел объект Timer. приаттачил к нему метод который
EW>EW>Thread.Sleep
EW>
В варианте с таймером OnStart запускается, запускает сервис и возвращает управление. В варианте с Thread.Sleep нужно получить такое же поведение. Если работа сервиса будет выполняться в методе OnStart, то Windows постоянно будет ругаться: "Сервис начал запускаться, да так и не пришёл в запущенное состояние".
Получается, нужно будет создавать отдельный поток, который запускать по OnStart и т.д.
Возможно, вариант с таймером лучше. Нужно только проверяться при каждом тике, закончилась ли обработка предыдущего тика таймера. И не забывать использовать оператор lock в этом случае.
... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, sndralex, Вы писали:
S>Уважаемые Гуру.Net
S>Подскажите плз как правильно организовать сабж.
S>Мне нужен сервис который перебирает файлы в определенной директории и чего-то с ними делает каждые 5 мин.
Может быть будет полезно не перебирать файлы в директории каждые 5 мин, а ожидать изменений в этой директории при помощи FileSystemWatcher? Тогда, возможно, можно будет обрабатывать события асинхронно. Конечно все зависит от задачи.
... << RSDN@Home 1.1 beta 1 >>
Здравствуйте, mihailik, Вы писали:
S>S>while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
S> sleep(300000);
S> DoSomething();
S>}
S>
По аналогии с этим смотри
System.Threading.AutoResetEvent или
System.Threading.ManualResetEvent и
Thread.Sleep
Я сам ничего не придумывал, я просто на вопрос ответил, а уж где этот код будет вызываться...
Ed.ward
... << RSDN@Home 1.0 beta 7a >>
S>>S>>while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
S>> sleep(300000);
S>> DoSomething();
S>>}
S>>
EW>По аналогии с этим смотри
Аналогии аналогиями, но общеизвестные грабли лучше отметить.
... << RSDN@Home 1.1 beta 1 >>