C#定时器和Thread.sleepC#定时器和Thread.sleep(C# Timer or T

2019-05-17 08:59发布

我运行一个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
   }
}

Answer 1:

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;
    }
}

该代码可以像类似上面的一个



Answer 2:

计时器是一个更好的主意,海事组织。 这样一来,如果您的服务要求停止,它可以给响应非常快,只是没有再打电话定时器节拍处理......如果你在睡觉,服务经理将不得不等待50秒杀死你线程,这两者都不是非常不错的。



Answer 3:

要明白,你的代码会睡50秒结束一个循环,并开始下一之间是很重要的......

一个计时器会打电话每50秒的循环,这是不完全一样的。

他们俩都是有效的,但一个计时器也可能是你在找什么在这里。



Answer 4:

要注意的是调用sleep()将冻结的服务,因此,如果该服务被要求停止时,它不会对睡眠()调用的时间作出反应。



Answer 5:

是的,使用定时器将释放当前花费其大部分时间都在睡觉的主题。 一个定时器也会更准确地火每分钟所以你可能不会需要跟踪的lastMinute了。



Answer 6:

不太回答这个问题,但不具有

   if (error condition that would break you out of this) {
       break;      // leaves looping structure
   }

你或许应该有

while(!error condition)

另外,我有去Timer



Answer 7:

我已经使用两个定时器和Thread.sleep代码(x)的,或任一,视情况而定。

如果我有简短的代码块,需要repeadedly跑,我可能会使用一个计时器。

如果我有一段代码,可能需要更长的时间比延时定时器运行(如通过FTP,在这里我不控制或知道网络延迟或文件大小/计数从远程服务器检索文件),我会等待对的周期之间一段固定的时间。

两者都是有效的,但正如前面指出的,他们做不同的事情。 定时器运行,每x毫秒你的代码,即使以前的实例尚未完成。 Thread.sleep代码(x)的等待完成每次迭代后的一段时间,所以每个环路的总延迟将总是更长(可能不是由多)比睡眠周期。



Answer 8:

我需要一个线程每分钟闪光一次( 见这里的问题 ),现在我已经使用了DispatchTimer根据我收到的答案。

这些问题的答案提供一些参考,你可能会发现有用。



Answer 9:

我同意以及使用定时器是最好的选择。 我曾尝试类似过去你的解决方案,并开始有在那里,循环将失火的问题,我将不得不等待另一个Thread.sleep()方法之前,它会再次触发。 此外,它确实导致各种问题与停止的服务,我会得到它是如何不响应,并已被关闭不变错误。

@普拉香特的代码应该是正是你需要的。



Answer 10:

您可以使用一个。 但我认为Sleep()是容易的,明确的和更短的落实。



Answer 11:

我不得不说,睡眠是与它后面的状态机更好地执行。 这仍然让你在任何时候应用程序的控制,但允许在任何特定的时间需要的任何回应。 这也将处理计时器回调是比“的循环处理的执行时间”短

例如..

<!-- language: c# -->
public enum State
{
    Idle = 0,
    Processing = 1,
    Stop = 100,
}
public void Run()
{
    State state = State.Idle;   // could be a member variable, so a service could stop this too

    double intervalInSeconds = 60;
    System.DateTime nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
    while (state != State.Stop)
    {
        switch (state)
        {
            case State.Idle:
                {
                    if (nextExecution > System.DateTime.Now)
                    {
                        state = State.Processing;
                    }
                }
                break;
            case State.Processing:
                {
                    // do your once-per-minute code here

                    // if you want it to stop, just set it state to stop.
                    // if this was a service, you could stop execution by setting state to stop, also
                    // only time it would not stop is if it was waiting for the process to finish, which you can handle in other ways

                    state = State.Idle;
                    nextExecution = System.DateTime.Now.AddSeconds(intervalInSeconds);
                }
                break;
            default:
                break;
        }

        System.Threading.Thread.Sleep(1);
    }
}


文章来源: C# Timer or Thread.Sleep
标签: c# timer