2013-02-25 3 views
1

У меня есть служба 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 часа.

Любая помощь в этом вопросе было бы весьма признателен

+0

ты в курсе: http://www.codeproject.com/Articles/15407/SQL-Agent-A-Job-Scheduler-Framework ? –

+0

сбой: поиск GC.KeepAlive() –

+0

Что происходит в DoMaintenance? Возможно ли исключение? Происходит ли это при тестировании? –

ответ

0

В конце концов я использовал регулярные System.Timers.Timer, которые решить мои проблемы. Все еще не знаю, где я ошибся с System.Threading.Timer.

0

Поскольку вы не можете использовать агент SQL Server в SQL Server Express, лучшим решением является создание SQL-скрипта, а затем запуск его как запланированной задачи.

Это легко проверить и сохранить, у вас может быть несколько запланированных задач, чтобы вписаться в расписание резервного копирования/хранения.

Команда Я использую в запланированное задание:

C:\Program Files\Microsoft SQL Server\90\Tools\Binn\SQLCMD.EXE" -i"c:\path\to\sqlbackupScript.sql 
Смежные вопросы