.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拖曳控件。

posted on 2018-07-09 22:51  gezoo  阅读(201)  评论(0)    收藏  举报

导航