C#System.Timers.Timer自动关闭?

时间:2012-03-30 07:20:35

标签: c# multithreading visual-studio timer

我有一个Timer启动并在它自己的线程中无限期地执行它的工作,直到主线程中发生某些事情来禁用它,在这种情况下将启用另一个。这非常有效。唯一的问题是我想完全确保第二个计时器不会运行太长时间。

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

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

谢谢你们和gals :)

4 个答案:

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