2012-03-30 300 views
0

我有一个定时器,它会在它自己的线程中无限期地开始工作,直到在主线程中发生某些事情来禁用它,在这种情况下将启用不同的定时器。这工作完美。唯一的问题是我想完全确定第二个定时器不会运行太久。C#System.Timers.Timer自动关闭?

如果由于某些故障而没有收到特定的关机命令,例如10分钟后,是否有办法让计时器自动禁用?

我看到该类有InitializeLifetimeService方法。这听起来像可以帮助,但我不知道如何工作。

感谢球员和加尔斯:)

回答

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是一个谁是天生,其中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。

+0

你能咀嚼第3行的语法吗?我不确定我了解它是如何工作的。 – 2012-03-30 09:05:11

+0

我在上面插入了一个解释... - 注释中的代码有点乏味...... – ChriPf 2012-03-30 09:18:13

1

你为什么不让它把+1到一个全局变量每次迭代(比方说,如果蜱每秒),使计时器检查变量每一个刻度,一旦VAR达到600,告诉计时器禁用它自己。

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 
    } 
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(); 
     } 
    }