2010-09-16 57 views
4

我有一个控制台应用程序,并在主要的方法,我有这样的代码:如何在完成运行后停止定时器?

Timer time = new Timer(seconds * 1000); //to milliseconds 
time.Enabled = true; 
time.Elapsed += new ElapsedEventHandler(time_Elapsed); 

我只想让我的想法是,我应该停止在TIME_ELAPSED方法定时器定时运行一次。但是,由于我的计时器存在于Main()中,我无法访问它。

+0

System.Timers.Timer而是或System.Windows.Forms.Timer? 请指定,因为我来这里是为了同一个问题,但答案是针对不同的计时器,并没有帮助。 – PandaWood 2016-07-12 01:40:12

回答

21

你有timer_Elapsed方法的内部访问定时器:

public void timer_Elapsed(object sender, ElapsedEventArgs e) 
{ 
    Timer timer = (Timer)sender; // Get the timer that fired the event 
    timer.Stop(); // Stop the timer that fired the event 
} 

上述方法将停止任何计时器所触发的事件(如果你有多个定时器使用相同的处理程序,并希望每个定时器具有相同的行为)。

你也可以设置行为,当你实例定时器:

var timer = new Timer(); 
timer.AutoReset = false; // Don't reset the timer after the first fire 
+1

这就是我想要做的事情,你先回答得对,那么大检查! – Yom 2010-09-16 00:34:27

3

小示例应用程序:

static void Main(string[] args) 
    { 
     int seconds = 2; 
     Timer time = new Timer(seconds * 1000); //to milliseconds 
     time.Enabled = true; 
     time.Elapsed += new ElapsedEventHandler(MyHandler); 

     time.Start(); 

     Console.ReadKey(); 
    } 

    private static void MyHandler(object e, ElapsedEventArgs args) 
    { 
     var timer = (Timer) e; 
     timer.Stop(); 
    } 
2

我假设你正在使用System.Timers.Timer,而不是System.Windows.Forms.Timer

您有两种选择。

首先,可能是最好的,是对AutoReset属性设置为false。这应该做你想要的。

time.AutoReset = false; 

另一种选择是在事件处理程序中调用Stop

1

您也可以使用System.Threading.Timer。它的构造函数有两个时间参数:

  • 第一“嘀”之前的延迟(由于时间)
  • 周期

设置期间Timeout.Infinite再次开火,以防止。

+0

如何将它设置为Timeout.Infinite可能是一个合理的问题 - 它并不明显 – PandaWood 2016-07-12 01:41:46

相关问题