2012-12-04 30 views
-3

在我的C#应用​​程序中,我需要调用基于计时器的方法。当我启动程序时,我希望定时器开始 - 然后每隔10秒调用一次方法。其次 - 如果我在10秒范围的期满之前手动调用该方法,我希望定时器重置 - 并等待执行10秒(当它有时不会触发)。换句话说 - 如果计时器则位于6秒的时候,我手动触发 - 我希望计时器等待10秒 - 在6获取计时事件

  1. 什么是创建这样一个计时器的最好方法不火?
  2. 一旦我有了计时器,我该如何有效地控制它的手动过期?
+1

http://www.dotnetperls.com/timer –

+0

你可以发布一些代码或伪代码,所以我们可以帮忙吗? –

+1

'System.Threading.Timer'是你要走的路。看看[MSDN](http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx)以供参考 – Spontifixus

回答

1

System.Timer.Timer类适合所有你需要的。

我想让计时器开始 - 然后每10秒调用一次方法。

这第一部分是容易的,你需要给interval属性设置为10000,该AutoReset属性为true并处理Elapsed事件。

二 - 如果我手动调用之前10秒跨度的 到期的方法中,我希望定时器复位 - 并从 执行

手动触发等待10秒实际上没有那么简单。最好的办法就是停下来,在流逝的事件中做任何事情,然后重新启动它。

但是这里有一个很大的提示。您需要确保处理方法是可重入的,因为计时器在另一个线程上执行,而不是手动触发的。如果您的方法可能需要10秒钟才能执行,这也是一个问题。使用lock是最简单的方法。

为了演示这个计时器,这里有一个小程序,当你按下回车键后会手动启动,然后等待两秒钟再次启动。

class Program 
{ 
    static void Main(string[] args) 
    { 

     var timer = new System.Timers.Timer(); 
     timer.Interval = 2000; // 2 seconds here 
     timer.AutoReset = true; //Restart 


     Action<object, EventArgs> Elapsed = (object o, EventArgs e) => Console.WriteLine(DateTime.Now); 

     timer.Elapsed += new System.Timers.ElapsedEventHandler(Elapsed); 
     timer.Start(); 
     while (Console.ReadLine() != "quit") 
     { 
      timer.Stop(); 
      Elapsed.Invoke(new object(), EventArgs.Empty); 
      timer.Start(); 

     } 
    } 
}