.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 阅读() 评论() 编辑 收藏

版权声明:本文为gezoo原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/gezoo/p/9285314.html