У меня есть эта простая служба Windows, которая является частью браузера. Он выполняет проверку базы данных и, если необходимо, обновляет некоторые строки. Эти действия занимают от 0,5 до 1 секунды.Служба Windows с таймером 25 секунд спустя
Данные, которые он читает, являются датой, указывающей, должен ли элемент обновляться.
Работает отлично, однако это всегда примерно на 25 секунд позже. Если я добавлю элемент в очередь, и этот элемент будет завершен в 15:00:00, служба обновит его в 15:00: 25ish.
Я пробовал использовать threading.timer, один поток и timers.timer, и все работает одинаково. Я также попытался остановить таймер во время прогона, хотя он занимает меньше секунды, поэтому это не должно быть проблемой.
Я также пытался подключить службу к отладчику, и то же самое происходит, ЕСЛИ я не поставил точку останова. Затем это происходит, как только он попадает в точку останова, и я нажимаю f5 для продолжения.
Может ли кто-нибудь пролить свет на то, почему служба, похоже, отстает? И возможное решение.
Я думал, что у меня закончилась нить, но у меня осталось много 1000, поэтому я немного пуст.
Пожалуйста, спросите, нужна ли вам дополнительная информация, поэтому я могу предоставить.
Я использую .net 4.0/C#
Threading.Thread
public partial class Service : ServiceBase
{
Thread thread;
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
thread = new Thread(DoWork);
thread.Start();
}
private static void DoWork()
{
while (true)
{
//finish workingqueueitems
WorkingQueue.ProcessFinishedItems();
Thread.Sleep(1000);
}
}
protected override void OnStop()
{
thread.Abort();
}
}
Timers.Timer
public partial class Service : ServiceBase
{
System.Timers.Timer workingQueueTimer;
public Service()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
workingQueueTimer = new System.Timers.Timer();
workingQueueTimer.Elapsed += new ElapsedEventHandler(workingQueueTimer_Elapsed);
workingQueueTimer.Interval = 1000;
workingQueueTimer.Enabled = true;
}
void workingQueueTimer_Elapsed(object sender, ElapsedEventArgs e)
{
workingQueueTimer.Enabled = false;
DoWork();
workingQueueTimer.Enabled = true;
}
private static void DoWork()
{
//finish workingqueueitems
WorkingQueue.ProcessFinishedItems();
}
protected override void OnStop()
{
workingQueueTimer.Stop();
workingQueueTimer.Dispose();
}
}
«Я думал, что у меня закончилась нить, но у меня есть хорошая 1000 левых», где вы получили этот номер? –
ваш код беспорядок. удалить инициализацию потока, while (true), Thread.sleep. ваш таймер опаздывает до завершения DoWork! – giammin
-Scott: Я использовал ThreadPool.GetAvailableThreads(). -giammin: Как я уже сказал, мои знания ограничены. Не могли бы вы объяснить причины, почему мне это нужно? Таймеры. Попытка была испытанием, поскольку таймеры. Таймер вел себя медленно. Я обновлю код, чтобы он показывал оба примера. – Gucchi