2013-09-11 3 views
6

Следующий периодический таймер прямого хода (который должен работать ad-infinitum) останавливается сразу после 61 прогона. То же самое справедливо, если я изменяю .FromMinutes(10):Периодический таймер останавливается неожиданно, после 61 прогона

static void Main(string[] args) { 
    var timerEvery5 = new Timer(
      new TimerCallback((o) => Console.WriteLine("5-minutes handler launched at {0}", DateTime.Now.ToString("yyyy-MM-dd HH:mm"))), 
      null, 
      new TimeSpan(0), // first run immediately 
      TimeSpan.FromMinutes(5)); // then every 5 minutes 
    for (; ;) 
     Thread.Sleep(23457); 
} 

Я попробовал его на пару 8 64-битных систем Windows, с .Net 4.5. Программа компилируется и запускается из командной оболочки. Это ошибка, или я чего-то не хватает?

+1

23457 странно специфично. –

ответ

9

Я считаю, что ваш таймер получает сбор мусора в результате оптимизации времени выполнения и определения того, что переменная timerEvery5 больше не ссылается на метод ... Попробуйте установить ее в статическую переменную и посмотрите, исправляет ли она проблему , Это или вызов GC.KeepAlive(timerEvery5); ПОСЛЕ цикла сна, поскольку этот вызов сохраняет переменную un-GC'd до тех пор, пока не будет выполнен метод (вроде неинтуитивного).

EDIT: по этой ссылке: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx см. Первый пример, поскольку это аналогичная проблема. Цитата из примера:

// If the timer is declared in a long-running method, use 
// KeepAlive to prevent garbage collection from occurring 
// before the method ends. 
//GC.KeepAlive(aTimer); 
+1

Renan - см. Эту ссылку: http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx – Haney

+1

@Renan Нет, GC знает, что 'timerEvery5' больше не используется в коде, поэтому он может собирать Это. –

+1

Я стою исправлены. +1, то. – Renan

Смежные вопросы