У меня есть Сервис, который поражает базу данных каждые 10 секунд и получает данные, если существует кто-либо. Вещь состоит в том, что обработка этих данных может занять до 30 секунд. Если я буду использовать Таймер с интервалом 10 секунд, то сервис получит те же данные дважды.
Эффект я пытаюсь достигнуть (Только для визуализации):
while(true)
{
if(Getnrofrows() > 0)
do stuff
else
sleep for 10 sec
}
Люди, заявляющие Поток. Сон является плохой идеей в услугах по производству, как я делаю это с таймерами?
/ микрофон
Вы пытались установить для свойства Timer автоматический сброс значения false и снова включить таймер, когда процесс обновления данных закончился?
using System;
public class PortChat
{
public static System.Timers.Timer _timer;
public static void Main()
{
_timer = new System.Timers.Timer();
_timer.AutoReset = false;
_timer.Interval = 100;
_timer.Elapsed += new System.Timers.ElapsedEventHandler(_timer_Elapsed);
_timer.Enabled = true;
Console.ReadKey();
}
static void _timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
//Do database refresh
_timer.Enabled = true;
}
}
Я не вижу никаких проблем с использованием сна, за исключением того, что вы можете получить некрасивый код.
Чтобы ответить на ваш вопрос:
public class MyTest
{
System.Threading.Timer _timer;
public MyTest()
{
_timer = new Timer(WorkMethod, 15000, 15000);
}
public void WorkMethod()
{
_timer.Change(Timeout.Infinite, Timeout.Infinite); // suspend timer
// do work
_timer.Change(15000, 15000); //resume
}
}
В этом подходе нет ничего плохого. Спящий поток не потребляет циклов ЦП.
Если вам нужно делать что-то ровно каждые X секунд, лучше всего использовать таймер. Если, с другой стороны, вы хотите сделать паузу на X секунд, тогда подойдет Thread.Sleep.
Thread.Sleep
сам по себе неплох для службы, просто вам нужно реагировать на команды службы, поэтому рабочий поток не должен переходить в спящий режим на час, но скорее нужно спать на короткие периоды времени, а затем просыпаться и слушать, если часть службы, контролирующая службу, говорит ей остановиться по какой-либо причине.
Вы хотите сделать так, чтобы, если администратор скажет вашей службе остановиться, она остановится достаточно быстро, чтобы не было сообщений о тайм-ауте, в которых администратор не может быть уверен, что ваша служба остановлена, и это безопасно перезагрузить машину или что-то подобное.