之前学习过c#中定时器Timer的基本用法,在使用过程中,有一个问题,一直困扰着自己,就是在初始化定时器的时候,如果设置的interval过小,或者每次执行的业务非常耗时的时候,这时候该怎么处理?第一次还没执行结束,下一次已经触发了。
<span style="color: #0000ff;">namespace<span style="color: #000000;"> TimerTest
{
<span style="color: #0000ff;">class<span style="color: #000000;"> Program
{
<span style="color: #0000ff;">static Timer timer = <span style="color: #0000ff;">new<span style="color: #000000;"> Timer();
<span style="color: #0000ff;">static <span style="color: #0000ff;">void Main(<span style="color: #0000ff;">string<span style="color: #000000;">[] args)
{
timer.Interval </span>= <span style="color: #800080;">1000</span><span style="color: #000000;">;
timer.AutoReset </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
timer.Enabled </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
timer.Elapsed </span>+=<span style="color: #000000;"> timer_Elapsed;
Console.Read();
}
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> count = <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> timer_Elapsed(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,ElapsedEventArgs e)
{
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">第{0}次触发</span><span style="color: #800000;">"</span><span style="color: #000000;">,count.ToString());
</span><span style="color: #0000ff;">if</span> (count == <span style="color: #800080;">10</span><span style="color: #000000;">)
{
timer.Enabled </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">当前线程:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Threading.Thread.Sleep(</span><span style="color: #800080;">10</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">第{0}次处理完成</span><span style="color: #800000;">"</span><span style="color: #000000;">,count.ToString());
count</span>++<span style="color: #000000;">;
}
}
}
<span style="color: #0000ff;">namespace<span style="color: #000000;"> TimerTest
{
<span style="color: #0000ff;">class<span style="color: #000000;"> Program
{
<span style="color: #0000ff;">static <span style="color: #0000ff;">readonly <span style="color: #0000ff;">object obj = <span style="color: #0000ff;">new <span style="color: #0000ff;">object<span style="color: #000000;">();
<span style="color: #0000ff;">static Timer timer = <span style="color: #0000ff;">new<span style="color: #000000;"> Timer();
<span style="color: #0000ff;">static <span style="color: #0000ff;">void Main(<span style="color: #0000ff;">string<span style="color: #000000;">[] args)
{
timer.Interval </span>= <span style="color: #800080;">1000</span><span style="color: #000000;">;
timer.AutoReset </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
timer.Enabled </span>= <span style="color: #0000ff;">true</span><span style="color: #000000;">;
timer.Elapsed </span>+=<span style="color: #000000;"> timer_Elapsed;
Console.Read();
}
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">int</span> count = <span style="color: #800080;">1</span><span style="color: #000000;">;
</span><span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> timer_Elapsed(<span style="color: #0000ff;">object</span><span style="color: #000000;"> sender,ElapsedEventArgs e)
{
</span><span style="color: #0000ff;">lock</span><span style="color: #000000;"> (obj)
{
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">第{0}次触发</span><span style="color: #800000;">"</span><span style="color: #000000;">,count.ToString());
</span><span style="color: #0000ff;">if</span> (count == <span style="color: #800080;">10</span><span style="color: #000000;">)
{
timer.Enabled </span>= <span style="color: #0000ff;">false</span><span style="color: #000000;">;
}
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">当前线程:</span><span style="color: #800000;">"</span> +<span style="color: #000000;"> System.Threading.Thread.CurrentThread.ManagedThreadId);
System.Threading.Thread.Sleep(</span><span style="color: #800080;">2000</span><span style="color: #000000;">);
Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">第{0}次处理完成</span><span style="color: #800000;">"</span><span style="color: #000000;">,count.ToString());
count</span>++<span style="color: #000000;">;
}
}
}
}