.NET中常用的几个Timer
.NET中常用的几个Timer
System.Threading.Timer
在一个线程池线程上执行的定时的(周期性发生的)后台任务。创建一个Timer对象时,会在线程池获取新线程执行
class Program
{
static void Main(string[] args)
{
ThreadTimer threadTimer = new ThreadTimer();
threadTimer.Start();
Console.ReadLine();
}
}
class ThreadTimer
{
Timer timer;
public void Start()
{
Console.WriteLine("Main thread id:{0}", Thread.CurrentThread.ManagedThreadId);
timer = new Timer(Callback, 5, 0, Timeout.Infinite);
}
private void Callback(object state)
{
Console.WriteLine("Thread id:{0}", Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(1000);
timer.Change(2000, Timeout.Infinite);
}
}
输出
Main thread id:1
Thread id:4
Thread id:4
……
System.Windows.Forms.Timer
创建一个Timer实例,相当于告诉Windows将一个Timer和调用线程关联(通常这个线程就是UI线程)。当Timer触发时,Windows将一条Timer消息(WM_TIMER)注入线程的消息队列。线程必须执行一个消息泵(Message Loop)来提取这些消息,并把他们派遣给想要的回调方法。所有的工作都只由一个线程完成,设置TImer的线程就是执行回调方法的线程。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
Console.WriteLine("Current thread:{0}", Thread.CurrentThread.ManagedThreadId);
Timer timer = new Timer
{
Interval = 1000
};
timer.Tick += Timer_Tick;
timer.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
textBox1.Text += string.Format("Current thread:{0}{1}", Thread.CurrentThread.ManagedThreadId, Environment.NewLine);
Console.WriteLine("Current thread:{0}", Thread.CurrentThread.ManagedThreadId);
}
private void button2_Click(object sender, EventArgs e)
{
Console.WriteLine("Current thread:{0}", Thread.CurrentThread.ManagedThreadId);
ThreadPool.QueueUserWorkItem((state) =>
{
Timer timer = new Timer
{
Interval = 1000
};
timer.Tick += Timer_Tick1;
timer.Start();
});
}
private void Timer_Tick1(object sender, EventArgs e)
{
textBox1.Text += string.Format("Current thread:{0}{1}", Thread.CurrentThread.ManagedThreadId, Environment.NewLine);
Console.WriteLine("Current thread:{0}", Thread.CurrentThread.ManagedThreadId);
}
}
输出
点击button1输出
Current thread:1
Current thread:1
Current thread:1
Current thread:1
点击button2输出
Current thread:1
System.Windows.Threading.DispatcherTimer
silverlight和WPF的Timer实现,等价于winfrom的System.Windows.Forms.Timer
System.Timers.Timer
这个Timer是System.Threading.Timer类的封装。派生于System.ComponentModel.Component,方便Visual Studio IDE拖曳控件。