2012-02-24 72 views
2

我已经在Windows服务中使用System.Threading.Timer当我设置了1分钟后执行定时器。从12:00:00开始。system.threading.timer无法工作

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

计时器在此间隔

12:00:00 12时○○分59秒 12时01分00秒 12时02分00秒 12时02分59秒

excuted

,但我想在

12:00:00到EXCUTE12:01:00 12时02分00秒 12:03:00

为什么计时器开始在12点〇〇分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中的相同的应用程序它的沃金完美,但在Windows 7 & Windows Server 2008它无法正常工作。

如何解决Threading.Timer中的这个问题?

+1

简短的回答是:不要使用'Threading.Timer'。这是不准确的。您需要使用高分辨率多媒体计时器。例如,请参阅[本文](http://www.codeproject.com/Articles/5501/The-Multimedia-Timer-for-the-NET-Framework)。 – AVIDeveloper 2012-02-24 13:07:47

+0

它在Windows XP中的工作完美,为什么不在Windows 7 – user847455 2012-02-24 13:19:52

+0

也许Win7机器繁忙,而WinXP更加闲置。一个很好的检查就是将你的WinXP机器与很多进程重叠,看看你的解决方案是否仍然有效。有了多媒体计时器,它会。 – AVIDeveloper 2012-02-24 13:23:23

回答

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 2012-03-14 00:38:10

+0

为什么这项工作只能在本地测试?当我部署到生产服务器时,它什么都不做,它会发生吗? – 2013-01-10 19:34:54