这段代码是无限循环的吗?

时间:2010-02-23 16:46:45

标签: c# timer

我有以下代码,这是否会运行无限循环? 我试图每分钟安排一些事情,控制台应用程序应该持续运行,直到我关闭它。

class Program
{
  static int curMin;
  static int lastMinute = DateTime.Now.AddMinutes(-1).Minutes;

 static void Main(string[] args)
 {
   // Not sure about this line if it will run continuously every minute??
   System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(TimCallBack), null, 1000, 60000);

  Console.Read();
  timer.Dispose();
 }
   private static void TimCallBack(object o)
   {
      curMin = DateTime.Now.Minute;
      if (lastMinute < curMin)
      {
          // Do my work every minute
          lastMinute = curMin;
      }
    }

}

6 个答案:

答案 0 :(得分:10)

KISS - 或者您正在争夺Rube Goldberg奖励? ; - )

static void Main(string[] args)
{
   while(true)
   {
     DoSomething();
     if(Console.KeyAvailable)
     {
        break;     
     }
     System.Threading.Thread.Sleep(60000);
   }
}

答案 1 :(得分:2)

我认为您的方法应该可以正常运行,假设您没有按下控制台窗口上的任何键。上面的答案肯定会奏效,但不是最漂亮的。

答案 2 :(得分:1)

只要你的main()退出,所有其他线程也会自动关闭。

答案 3 :(得分:1)

如果需要一直运行,创建服务可能是更好的解决方案吗? Example here

答案 4 :(得分:1)

为什么不将您的应用程序添加到Windows任务计划程序中,并且每次启动控制台应用程序时只执行一个“任务”(并且不要考虑自己安排计划?)

并回答你的问题:没有你的样本没有“循环”,它是事件驱动的,并将在按键时关闭。

答案 5 :(得分:-1)

使用超时停止的事件可能会起作用,如下所示:

class Program
{
    static TimeSpan _timeSpan = new TimeSpan(0, 0, 5);
    static ManualResetEvent _stop = new ManualResetEvent(false);

    static void Main(string[] args)
    {
        Console.TreatControlCAsInput = false;
        Console.CancelKeyPress += delegate (object sender, ConsoleCancelEventArgs e)
        { 
            _stop.Set();
            e.Cancel = true;
        };

        while (!_stop.WaitOne(_timeSpan))
        {
            Console.WriteLine("Waiting...");
        }
        Console.WriteLine("Done.");
    }
}