У меня есть служба Windows, которая, между прочим, нуждается в обслуживании базы данных каждые 24 часа. (SQL express, поэтому не могу запланировать его в базе данных)System.Threading.Timer callback не попадает
Для этого я создал таймер с обратным вызовом метода обслуживания базы данных, но, похоже, только один раз ударил (после создания таймера, я предполагать). я предположил, что это из-за самого таймера, выход из объема и будучи GC'd, но, похоже, работает
Базовая схема обслуживания, как это ни один из sollutions я пробовал:
WindowsService.cs:
protected override void OnStart(string[] args)
{
ThreadPool.QueueUserWorkItem(StartServices);
}
private void StartServices() { Manager.Start(); }
Manager.cs:
public class Manager
{
private static Timer MaintenanceTimer;
public static void Start()
{
MaintenanceTimer = new Timer(DoMaintenance);
MaintenanceTimer.Change(new TimeSpan(0), new TimeSpan(24,0,0,0)); //I use 1 minute for testing
}
}
Очевидно, что этот код сильно упрощены, но это довольно много, что происходит , Как было сказано выше, я считаю, GC это проблема, которая заставила меня попробовать следующие 2 вещи:
- Используйте конструктор Таймер (обратный вызов), так что это обеспечит самосоотнесения обратного вызова. Тем не менее, это все равно не помешало бы от истечения срока действия, так что это не выход.
- Определите таймер как статическую переменную внутри класса Менеджера. Это должно предотвратить его от когда-либо GC'd, но, по-видимому, он не называется каждые 24 часа.
Любая помощь в этом вопросе было бы весьма признателен
ты в курсе: http://www.codeproject.com/Articles/15407/SQL-Agent-A-Job-Scheduler-Framework ? –
сбой: поиск GC.KeepAlive() –
Что происходит в DoMaintenance? Возможно ли исключение? Происходит ли это при тестировании? –