C#Timer或Thread.Sleep

Ado*_*s L 46 c# timer

我正在运行Windows服务并使用循环和Thread.Sleep来重复任务,使用计时器方法会更好吗?

如果是,代码示例会很棒

我目前正在使用此代码重复

int curMinute;
int lastMinute = DateTime.Now.AddMinutes(-1).Minute;

while (condition)
{
   curMinute = DateTime.Now.Minute;

   if (lastMinute < curMinute) {
         // do your once-per-minute code here
         lastMinute = curMinute;
   }

   Thread.Sleep(50000);      // sleeps for 50 seconds

   if (error condition that would break you out of this) {
       break;      // leaves looping structure
   }
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 43

计时器是一个更好的主意,IMO.这样,如果要求您的服务停止,它可以非常快速地响应,并且不会再次调用计时器滴答处理程序...如果您正在睡觉,服务管理器将要么等待50秒或者杀死您的线程,两者都不是非常好.

  • 为了避免杀死线程,可以使用ManualResetEvent.WaitOne(50000)而不是Thread.Sleep().然后你可以设置()等待句柄,以便在最方便的时候通知线程终止.在这种情况下,计时器可能仍然是优选的. (16认同)

Pra*_*nth 32

class Program
{
    static void Main(string[] args)
    {
        Timer timer = new Timer(new TimerCallback(TimeCallBack),null,1000,50000);
        Console.Read();
        timer.Dispose();
    }

    public static void TimeCallBack(object o)
    {
      curMinute = DateTime.Now.Minute;
      if (lastMinute < curMinute) {
       // do your once-per-minute code here
       lastMinute = curMinute;
    }
}
Run Code Online (Sandbox Code Playgroud)

代码可能类似于上面的代码

  • 请注意,计时器可能会受到额外的系统停顿或睡眠可能没有的高负载的影响.这应该在任何人的实施中考虑. (6认同)

Chr*_*per 11

重要的是要理解你的代码将在结束一个循环和开始下一个循环之间休眠50秒......

计时器将每隔50秒调用一次循环,这不完全相同.

它们都是有效的,但计时器可能就是你在这里寻找的.


Phi*_*ert 7

请注意,调用Sleep()将冻结服务,因此如果请求服务停止,它将不会在Sleep()调用期间做出反应.