计时器不止一次 [英] Timer elapsing more than once

查看:133
本文介绍了计时器不止一次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

你好朋友,



你好朋友,我正在研究一个基于计时器的项目。我需要计时器应该只过一次。我写了以下代码:





  class 计划
{
静态 void Main( string [] args)
{

Start_Event_Timer( 拉胡);
Start_Event_Timer( Varinder);


Console.ReadLine();
}

静态计时器t;
public static void Start_Event_Timer ( string s1)
{
Console.WriteLine( 计时器开始于:{0}在{1},s1,DateTime.Now.ToString());
t = new System.Timers.Timer( 60 * 1000 );
t.Enabled = true ;
t.Elapsed + =(发件人,e)= > G_TIMER_ELAPSED(发件人,e,s1);

t.Start();
}


public static void G_TIMER_ELAPSED(对象发​​件人,ElapsedEventArgs e,字符串 s1 )
{
Console.WriteLine( 计时器已过去:{0}位于{1} ,s1,DateTime.Now.ToString());

t.AutoReset = false ;
t.Enabled = false ;
t.Stop();
}

}







我也会告诉你我从控制台捕获的输出:





引用:

计时器开始于:Rahul于4/25/2014 11:46:04 AM

计时器开始于:Varinder at 4/25/2014 11:46:04 AM >
计时器已经过去了:Rahul于2014年4月25日上午11:47:04

计时器已经过去了:Varinder at 4/25/2014 11:47:04 AM
计时器已过去:Rahul于2014年4月25日上午11:48:04

计时器已过去:Rahul于2014/4/25 11:49:04
计时器已经过去了:Rahul于2014年4月25日上午11:50:04

计时器已经过去了:Rahul于2014/4/25 11:51:04








有什么建议吗?至于为什么即使我启动了一次计时器多次?

解决方案

你正在使用一个位置,静态字段t来存储两个计时器实例。可通过t访问的定时器是最后一个分配的Varinder。虽然代码很糟糕,但可以按预期工作,如下所示:

  public  静态  void  G_TIMER_ELAPSED(对象发​​件人,ElapsedEventArgs e, string  s1)
{
计时器t =(计时器)发件人;
Console.WriteLine ( 计时器已经过去:{0}在{1},s1,DateTime.Now.ToString ());

t.AutoReset = false ;
t.Enabled = false ;
t.Stop();
}





事件处理程序中的sender参数包含调用实例,因此只需转换对象即可获得正确的Timer。



Alan。


http://social.msdn.microsoft.com/Forums/vstudio/en-US/03e83a93 -652f-4559-ba9e-f397b1755ad7 / timerenabled-VS-timerstartstop-?论坛= csharpgeneral

Hello Friends,

Hello Friends, I am working on a timer based project. I need that the timer should elapse just once. I wrote the following code:


class Program
   {
       static void Main(string[] args)
       {

           Start_Event_Timer("Rahul");
           Start_Event_Timer("Varinder");


           Console.ReadLine();
       }

       static Timer t;
       public static void Start_Event_Timer(string s1)
       {
           Console.WriteLine("Timer started for : {0} at {1}", s1, DateTime.Now.ToString());
           t = new System.Timers.Timer(60 * 1000);
           t.Enabled = true;
           t.Elapsed += (sender, e) => G_TIMER_ELAPSED(sender, e, s1);

           t.Start();
       }


       public static void G_TIMER_ELAPSED(object sender, ElapsedEventArgs e, string s1)
       {
           Console.WriteLine("Timer elapsed for :{0} at {1} ", s1, DateTime.Now.ToString());

           t.AutoReset = false;
           t.Enabled = false;
           t.Stop();
       }

     }




I will also show you the output which i captured from the console:


Quote:

Timer started for : Rahul at 4/25/2014 11:46:04 AM
Timer started for : Varinder at 4/25/2014 11:46:04 AM
Timer elapsed for :Rahul at 4/25/2014 11:47:04 AM
Timer elapsed for :Varinder at 4/25/2014 11:47:04 AM
Timer elapsed for :Rahul at 4/25/2014 11:48:04 AM
Timer elapsed for :Rahul at 4/25/2014 11:49:04 AM
Timer elapsed for :Rahul at 4/25/2014 11:50:04 AM
Timer elapsed for :Rahul at 4/25/2014 11:51:04 AM




Any suggestions? as to why is the timer being elapsed multiple times even if i started it once?

解决方案

You are using one location, the static field t, to store two timer instances. The timer accessible via t is the last one assigned, "Varinder". Although the code is awful, it is possible to make it work as intended, like this :

public static void G_TIMER_ELAPSED(object sender, ElapsedEventArgs e, string s1)
{
    Timer t = (Timer)sender;    
    Console.WriteLine("Timer elapsed for :{0} at {1} ", s1, DateTime.Now.ToString());

    t.AutoReset = false;
    t.Enabled = false;
    t.Stop();
}



The sender parameter in the event handler contains the invoking instance and so simply casting the object gets the correct Timer.

Alan.


http://social.msdn.microsoft.com/Forums/vstudio/en-US/03e83a93-652f-4559-ba9e-f397b1755ad7/timerenabled-vs-timerstartstop-?forum=csharpgeneral


这篇关于计时器不止一次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆