前些时候做了一个定时发送器的控制台程序。代码如下
Code
1
2 while (true)
3 {
4 TestOnTimer();
5 System.Threading.Thread.Sleep(10000);
6 }
使用while true 与 主线程休眠的方式来现实定时执行TestOnTimer()的功能。然而,由于Sleep()方法随机可能会出现长时间休眠后无法自动唤醒的问题[原因未知],所以转而使用Timer类提供的方法。代码如下:
Code
class Program
{
static void Main(string[] args)
{
System.Timers.Timer timer= new System.Timers.Timer();
timer.Elapsed += new System.Timers.ElapsedEventHandler(TestOnTimer);
timer.Interval = 1000;
timer.Enabled = true;
System.Threading.Thread.Sleep(10000);
Console.WriteLine("休眠醒来");
Console.ReadLine();
}
public static void TestOnTimer(object obj,System.Timers.ElapsedEventArgs args)
{
Console.WriteLine("Invoking");
}
}
Timer会为Elapsed委托的每一个方法NEW一个子线程异步去调用方法体。由此,即使主线程休眠却也并不影响委托方法的执行调用[猜测而已,未验证推论是否正确]
假设方法TestOnTimer执行的功能为check OneTable表某一状态,为0则并执行动作ActionOnTimer(),后更改OneTable状态为1。
如果Intergal设置时间过短,则有可能出现,第一次调用TestOnTimer方法并未结束,OneTable状态仍旧为0的时候便已经开始了第二次TestOnTimer()方法的调用,即出现ActionOnTimer()功能的重复调用。有时候,如果不加任何限制这无疑将是一场“灾难”。