如果你开发过Win32应用程序,你应该知道设置定时器是它API中的一部分。在这种情况下,你必须创建一个window来接收WM_TIMER的消息。我们所面临的第一个问题是,创建一个window来接收消息,但你却无法控制台应用程序中应用。其二,基于消息的执行有时不是很精确,并且如果你的应用程序要处理很多消息时,那情况将是很糟糕的。
一种改进方法是在WIn32定时器的基础上,为每一个定时器创建一个线程,并让它sleep一段时间,当到达定时时,就调用相应的方法。这种方式,使我们摆脱了windows的消息机制。能够更精确并能用于控制台程序。通用代码如下:
class MainApp
{
static void Main()
{
MyTimer myTimer = new MyTimer(2000); //自定义定时器
Console.ReadLine();
}
}
class MyTimer
{
int m_period;
public MyTimer(int period)
{
Thread thread;
m_period = period;
thread = new Thread(new ThreadStart(TimerThread)); //在定时器生成线程
thread.Start();
}
void TimerThread()
{
Thread.Sleep(m_period);
OnTimer();
}
void OnTimer()
{
Console.WriteLine("OnTimer");
}
}
下面这种方法更好:
一种改进方法是在WIn32定时器的基础上,为每一个定时器创建一个线程,并让它sleep一段时间,当到达定时时,就调用相应的方法。这种方式,使我们摆脱了windows的消息机制。能够更精确并能用于控制台程序。通用代码如下:
class MainApp
{
static void Main()
{
MyTimer myTimer = new MyTimer(2000); //自定义定时器
Console.ReadLine();
}
}
class MyTimer
{
int m_period;
public MyTimer(int period)
{
Thread thread;
m_period = period;
thread = new Thread(new ThreadStart(TimerThread)); //在定时器生成线程
thread.Start();
}
void TimerThread()
{
Thread.Sleep(m_period);
OnTimer();
}
void OnTimer()
{
Console.WriteLine("OnTimer");
}
}
下面这种方法更好:
class MainApp
{
static void Main()
{
Timer timer1 = new Timer(new TimerCallback(OnTimer), 1, 0, 2000);
Timer timer2 = new Timer(new TimerCallback(OnTimer), 2, 0, 3000);
Console.ReadLine();
}
static void OnTimer(object obj)
{
Console.WriteLine("Timer: {0} Thread: {1} Is pool thread: {2}",
(int)obj,
Thread.CurrentThread.GetHashCode(),
Thread.CurrentThread.IsThreadPoolThread);
}
}
The output will be the following:
Timer: 1 Thread: 2 Is pool thread: True
Timer: 2 Thread: 2 Is pool thread: True
Timer: 1 Thread: 2 Is pool thread: True
Timer: 2 Thread: 2 Is pool thread: True
Timer: 1 Thread: 2 Is pool thread: True
Timer: 1 Thread: 2 Is pool thread: True
Timer: 2 Thread: 2 Is pool thread: True