完成运行后如何停止计时器?

时间:2010-09-16 00:19:19

标签: c# timer

我有一个Console App,在main方法中,我有这样的代码:

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

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

4 个答案:

答案 0 :(得分:22)

您可以访问timer_Elapsed方法内的Timer:

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
}

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

您还可以在实例化Timer时设置行为:

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

答案 1 :(得分: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 :(得分:2)

我假设您使用System.Timers.Timer而不是System.Windows.Forms.Timer

您有两种选择。

首先,可能是最好的,是将AutoReset属性设置为false。这应该完全符合你的要求。

time.AutoReset = false;

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

答案 3 :(得分:1)

您也可以使用System.Threading.Timer。它的构造函数需要两个与时间相关的参数:

  • 第一个“tick”(到期时间)之前的延迟
  • 期间

将句点设置为Timeout.Infinite以防止再次发射。