计时器不止一次 [英] Timer elapsing more than once
问题描述
你好朋友,
你好朋友,我正在研究一个基于计时器的项目。我需要计时器应该只过一次。我写了以下代码:
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屋!