C#裡面的三種Timer

來源:互聯網
上載者:User

標籤:c#   timer   



在.net中有三種計時器,一是System.Windows.Forms命名空間下的Timer控制項,它直接繼承自Componet;二是System.Timers命名空間下的Timer類。

Timer控制項:Timer控制項只有綁定了Tick事件,和設定Enabled=True後才會自動計時,停止計時可以用Stop()控制,通過Stop()停止之後,如果想重新計時,可以用Start()方法來啟動計時器。Timer控制項和它所在的Form屬於同一個線程;

 

System.Timers.Timer類:定義一個System.Timers.Timer對象,綁定Elapsed事件,通過Start()方法啟動計時,通過Stop()方法或者Enable=False停止計時。AutoReset屬性設定是否重複計時。Elapsed事件綁定就相當另開了一個線程,也就是說在Elapsed綁定的事件裡不能訪問其它線程裡的控制項。

 

System.Threading.Timer:定義該類時,主要有四個參數。TimerCallBack,一個返回值為void,參數為object的委託,也是計時器執行的方法。Object state,計時器執行方法的的參數。 int dueTime,調用 callback之前延遲的時間量(以毫秒為單位)。指定 Timeout.Infinite以防止計時器開始計時。指定零 (0)以立即啟動計時器。

int Period,調用 callback的時間間隔(以毫秒為單位)。指定 Timeout.Infinite可以禁用定期終止。

 

在這三種計時器中,第一種計時器和所在的Form處於同一個線程,因此執行的效率不高。而第二種和第三中計時器執行的方法都是新開一個線程,所以執行效率比第一種計時器要好。因此在使用計時器時,建議使用第二種和第三種。

下面是三中定時器使用的例子


1)Timer控制項  

  public partial class Timer : Form
    {

        int count = 0;
        public Timer()
        {
            InitializeComponent();

            //timer控制項可用
            this.timer1.Enabled = true;

           //設定timer控制項的Tick事件觸發的時間間隔
            this.timer1.Interval = 1000;

            //停止計時
            this.timer1.Stop();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            count += 1;
            this.tbTimer.Text = count.ToString();
        }

        private void btStart_Click(object sender, EventArgs e)
        {
            //開始計時
            this.timer1.Start();
        }

        private void btStop_Click(object sender, EventArgs e)
        {
            //停止計時
            this.timer1.Stop();
           
        }

    }


2)System.Timers.Timer

public partial class Timer : Form
    {
        int count = 0;

        private System.Timers.Timer timer = new System.Timers.Timer();

        public Timer()
        {
            InitializeComponent();

            //設定timer可用
            timer.Enabled = true;
           
            //設定timer
            timer.Interval = 1000;

            //設定是否重複計時,如果該屬性設為False,則只執行timer_Elapsed方法一次。
            timer.AutoReset = true;

            timer.Elapsed+=new System.Timers.ElapsedEventHandler(timer_Elapsed);
        }

        private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            count += 1;
            SetTB(count.ToString());
        }

        private void btStart_Click(object sender, EventArgs e)
        {
            timer.Start();
        }

        private void btStop_Click(object sender, EventArgs e)
        {
            timer.Stop();
        }

        private delegate void SetTBMethodInvok(string value);

        private void SetTB(string value)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetTBMethodInvok(SetTB), value);
            }
            else
            {
                this.tbTimer.Text = value;
            }
        }
    }

 

3) System.Threading.Timer

    public partial class Timer : Form
    {
        int count = 0;
        System.Threading.Timer timerThr;
        private delegate void SetTBMethodInvoke(object state);

        public Timer()
        {
            InitializeComponent();

            //初始化一個計時器,一開始不計時,調用Callback的時間間隔是500毫秒
            timerThr = new System.Threading.Timer(new TimerCallback(SetTB), null, Timeout.Infinite, 500);
        }

        public void SetTB(object value)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new SetTBMethodInvoke(SetTB), value);
            }
            else
            {
                count += 1;
                this.tbTimer.Text = count.ToString();
            }
        }

        private void btStart_Click(object sender, EventArgs e)
        {
            //開始計時
            timerThr.Change(0, 500);
        }

        private void btStop_Click(object sender, EventArgs e)
        {
            //停止計時
            timerThr.Change(Timeout.Infinite, 500);
        }
    }

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.