2012-02-24 2 views
2

Я использовал System.Threading.Timer в службе windows, когда я установил таймер для запуска через 1 минуту. начиная с 12:00:00.system.threading.timer не работает

timer1[timer] = 
    new System.Threading.Timer(timerDelegate, obj, dueTime, interval); 

таймер excuted на этом интервале

12:00:00 12:00:59 12:01:00 12:02:00 12:02:59

, но я хочу, чтобы в

преобразования приложений

12:00:00 12:01:00 12:02:00 12:03:00

почему таймер начал в 12:00:59?

я поставил остаток для выполнения следующего кода

декларация:

_interval[timer] = interval; 
_startTime[timer] = DATeTime + dueTime; 

используется в методе таймера обратного вызова

long elapsedMs = Convert.ToInt64((dt - _startTime[timer]).TotalMilliseconds); 
long intervalMs = Convert.ToInt64(_interval[timer].TotalMilliseconds); 
long remainder = elapsedMs % intervalMs; 
if (remainder != 0L) 
{ 
    timer1[timer].Change(
     _interval[timer] - TimeSpan.FromMilliseconds(remainder), 
     _interval[timer]); 
} 

При использовании того же приложения в Windows XP это WOKING отлично, но в windows 7 & windows server 2008 он не работает.

Как решить эту проблему в Threading.Timer?

+1

Короткий ответ: не используйте 'Threading.Timer'. Это неверно. Вам нужно будет использовать мультимедийный таймер высокого разрешения. См. [Эту статью] (например, http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework). – AVIDeveloper

+0

его работа в windows XP отлично почему не в окнах 7 – user847455

+0

Возможно, машина Win7 занята, а WinXP более простаивает. Хорошей проверкой было бы перегрузить вашу машину WinXP множеством процессов и посмотреть, работает ли ваше решение. С мультимедийными таймерами это будет. – AVIDeveloper

ответ

1

Вы можете попробовать System.Timers.Timer - это сработало хорошо для меня. Для удобства я вставил статический класс таймера с делегатом:

public static class Timer 
    { 
     private static System.Timers.Timer _timer = new System.Timers.Timer(); 
     public static void start(bool enabled, int interval) 
     { 
      _timer = new System.Timers.Timer(); 
      _timer.Elapsed += new ElapsedEventHandler(_timerElapsed); 
      _timer.Enabled = enabled; 
      _timer.Interval = interval; 
     } 
     static void _timerElapsed(object sender, ElapsedEventArgs e) 
     { 
      OnTimedEvent(sender, e);     
     } 
    } 
+1

'System.Timers.Timer' использует' System.Threading.Timer' внутренне, поэтому я не думаю, что он решит любые проблемы, которые имел OP. – svick

+0

Почему это работает только на местном тесте? Когда я разворачиваю серверы на извержениях, это ничего не делает, это происходит именно так? –

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