我有一个定时器,它会在它自己的线程中无限期地开始工作,直到在主线程中发生某些事情来禁用它,在这种情况下将启用不同的定时器。这工作完美。唯一的问题是我想完全确定第二个定时器不会运行太久。C#System.Timers.Timer自动关闭?
如果由于某些故障而没有收到特定的关机命令,例如10分钟后,是否有办法让计时器自动禁用?
我看到该类有InitializeLifetimeService方法。这听起来像可以帮助,但我不知道如何工作。
感谢球员和加尔斯:)
我有一个定时器,它会在它自己的线程中无限期地开始工作,直到在主线程中发生某些事情来禁用它,在这种情况下将启用不同的定时器。这工作完美。唯一的问题是我想完全确定第二个定时器不会运行太久。C#System.Timers.Timer自动关闭?
如果由于某些故障而没有收到特定的关机命令,例如10分钟后,是否有办法让计时器自动禁用?
我看到该类有InitializeLifetimeService方法。这听起来像可以帮助,但我不知道如何工作。
感谢球员和加尔斯:)
当您启动第二个给定的时间后,可以禁用它你可以考虑开始第三定时器。
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是一个谁是天生,其中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 +空格时实际获得的内容,因为您可以在较低方法中访问t1。
你为什么不让它把+1到一个全局变量每次迭代(比方说,如果蜱每秒),使计时器检查变量每一个刻度,一旦VAR达到600,告诉计时器禁用它自己。
只需声明一个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
}
分配一个经过事件处理程序和全球布尔
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();
}
}
你能咀嚼第3行的语法吗?我不确定我了解它是如何工作的。 – 2012-03-30 09:05:11
我在上面插入了一个解释... - 注释中的代码有点乏味...... – ChriPf 2012-03-30 09:18:13