我有一个Console App,在main方法中,我有这样的代码:
Timer time = new Timer(seconds * 1000); //to milliseconds
time.Enabled = true;
time.Elapsed += new ElapsedEventHandler(time_Elapsed);
我只想让计时器运行一次所以我的想法是我应该在time_Elapsed方法中停止计时器。但是,由于我的计时器存在于Main()中,我无法访问它。
答案 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。它的构造函数需要两个与时间相关的参数:
将句点设置为Timeout.Infinite以防止再次发射。