我有一个Timer启动并在它自己的线程中无限期地执行它的工作,直到主线程中发生某些事情来禁用它,在这种情况下将启用另一个。这非常有效。唯一的问题是我想完全确保第二个计时器不会运行太长时间。
如果由于某些故障没有收到特定的关机命令,有没有办法让计时器在10分钟后自动禁用?
我看到该类有一个InitializeLifetimeService方法。听起来它可以帮助但我不知道如何工作。
谢谢你们和gals :)
答案 0 :(得分:1)
为什么不让它每次迭代都给一个全局变量+1(比如它每秒滴答),让定时器在每次滴答时检查变量,一旦var达到600,告诉定时器禁用它自己。 / p>
答案 1 :(得分:1)
只需声明一个Class变量,并在启动计时器时将其设置为DateTime.Now。然后将其包含在您的计时器中:
DateTime time = DateTime.Now;
private void timer1_Tick(object sender, EventArgs e)
{
if (DateTime.Compare(DateTime.Now, time.AddMinutes(10)) > 0)
{
timer1.Stop();
}
// timer code
}
答案 2 :(得分:1)
您可以考虑在启动第二个计时器时启动第三个计时器,以便在给定时间后禁用它。
Timer t1 = new Timer(1000); // fire every second
Timer t2 = new Timer(60000); // fire after 10 minutes
t2.Elapsed += (o, e) => t1.Stop(); // disable timer 1 when timer 2 is elapsed
t1.Start();
t2.Start();
上面的示例顺便使用了 System.Timers.Timer 。如果您使用 System.Threading.Timer ,您可能会考虑在那里进行切换,因为 System.Timers.Timer 本质上是线程安全的,其中< strong> System.Threading.Timer 不是。
可以在这里找到相当不错的概述: http://msdn.microsoft.com/en-us/magazine/cc164015.aspx
为清晰起见编辑: 这条线
t2.Elapsed += (e, o) => t1.Stop();
也可以写成
t2.Elapsed += new ElapsedEventHandler(t2_Elapsed);
接着是
void t2_Elapsed(object sender, ElapsedEventArgs e)
{
t1.Stop();
}
这是你在Visual Studio中按Ctrl + Space时实际获得的,给定帽子你可以访问较低方法中的t1。
答案 3 :(得分:1)
分配已用事件处理程序和全局布尔值
Private Boolean eOccured = False;
System.Timers.Timer aTimer = new System.Timers.Timer();
aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent);
aTimer.Interval = 600000; //milliseconds(10 min)
aTimer.Enabled = True;
... 如果成功,代码会激活bool ...
然后在事件触发器上停止计时器。
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
If (eOccured)
{
aTimer.Stop();
}
}