windows service on C#
От: sndralex Израиль www.gdetotam.co.il
Дата: 18.08.03 15:13
Оценка:
Уважаемые Гуру.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
Re: windows service on C#
От: Ed.ward Россия  
Дата: 18.08.03 15:35
Оценка: +1
Здравствуйте, 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 >>
Re[2]: windows service on C#
От: mihailik Украина  
Дата: 19.08.03 09:41
Оценка: -1
S>>Ничего похожего на sleep не нашел. Зато нашел объект Timer. приаттачил к нему метод который

EW>
EW>Thread.Sleep
EW>


В варианте с таймером OnStart запускается, запускает сервис и возвращает управление. В варианте с Thread.Sleep нужно получить такое же поведение. Если работа сервиса будет выполняться в методе OnStart, то Windows постоянно будет ругаться: "Сервис начал запускаться, да так и не пришёл в запущенное состояние".

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

Возможно, вариант с таймером лучше. Нужно только проверяться при каждом тике, закончилась ли обработка предыдущего тика таймера. И не забывать использовать оператор lock в этом случае.
... << RSDN@Home 1.1 beta 1 >>
Re: windows service on C#
От: gerik  
Дата: 19.08.03 10:59
Оценка:
Здравствуйте, sndralex, Вы писали:

S>Уважаемые Гуру.Net


S>Подскажите плз как правильно организовать сабж.

S>Мне нужен сервис который перебирает файлы в определенной директории и чего-то с ними делает каждые 5 мин.

Может быть будет полезно не перебирать файлы в директории каждые 5 мин, а ожидать изменений в этой директории при помощи FileSystemWatcher? Тогда, возможно, можно будет обрабатывать события асинхронно. Конечно все зависит от задачи.
... << RSDN@Home 1.1 beta 1 >>
Re[3]: windows service on C#
От: Ed.ward Россия  
Дата: 19.08.03 11:56
Оценка:
Здравствуйте, 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 >>
Re[4]: windows service on C#
От: mihailik Украина  
Дата: 19.08.03 13:42
Оценка: 1 (1)
S>>
S>>while( ::WaitForSingleObject(m_hStop, 10) != WAIT_OBJECT_0 ) {
S>>    sleep(300000);
S>>   DoSomething();
S>>}
S>>


EW>По аналогии с этим смотри


Аналогии аналогиями, но общеизвестные грабли лучше отметить.
... << RSDN@Home 1.1 beta 1 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.