介紹兩種Timer定時器的使用

第一種,多線程

直接實例化Timer類,設置時間間隔,到達時間後執行想要執行的事件。代碼示例:app

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;

namespace Timer
{
    class Program
    {
        static void Main(string[] args)
        {
            // Create a new Timer with Interval set to 10 seconds.
            System.Timers.Timer aTimer = new System.Timers.Timer(10000); //實例化Timer類,設置間隔時間爲10000毫秒;
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); //到達時間的時候執行事件
            // Only raise the event the first time Interval elapses.
            aTimer.AutoReset = true; //設置是執行一次(false)仍是一直執行(true);
            aTimer.Enabled = true; //是否執行System.Timers.Timer.Elapsed事件;

            Console.WriteLine("Press \'q\' to quit the sample.");
            while (Console.Read() != 'q') ;
        }

        // Specify what you want to happen when the event is raised.
        private static void OnTimedEvent(object source, ElapsedEventArgs e)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

第二種,ui

使用讓程序休眠的方法Thread.sleep()。 Thread.Sleep靜態方法,使當前線程掛起指定的時間。沒有多線程的話,程序只有一個主線程,就是使整個程序休眠。spa

程序首先建立了一個定時器,它將在建立1秒以後開始每隔1秒調用一次CheckStatus()方法,當調用5次之後,在CheckStatus()方法中修改了時間間隔爲2秒,而且指定在10秒後從新開始。當計數達到10次,調用Timer.Dispose()方法刪除了timer對象,主線程因而跳出循環,終止程序。線程

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;

namespace ThreadExample
{
    class TimerExampleState
    {
        public int counter = 0;
        public Timer tmr;
    }
    class Program
    {
        static void Main(string[] args)
        {
            TimerExampleState s = new TimerExampleState();

            //建立代理對象TimerCallback,該代理將被定時調用
            TimerCallback timerDelegate = new TimerCallback(CheckStatus);

            //建立一個時間間隔爲1s的定時器
            Timer timer = new Timer(timerDelegate, s, 1000, 1000);
            // 第一個參數:指定了TimerCallback 委託,表示要執行的方法;
            // 第二個參數:一個包含回調方法要使用的信息的對象,或者爲空引用;
            // 第三個參數:延遲時間——計時開始的時刻距如今的時間,單位是毫秒,指定爲「0」表示//當即啓動計時器;
            // 第四個參數:定時器的時間間隔——計時開始之後,每隔這麼長的一段時間,TimerCallback所表明的方法將被調用一次,單位也是毫秒。指定 Timeout.Infinite 能夠禁用按期終止。
            s.tmr = timer;

            //主線程停下來等待Timer對象的終止
            while (s.tmr != null)
                Thread.Sleep(0);
            Console.WriteLine("Timer example done.");
            Console.ReadLine();
        }
        //下面是被定時調用的方法
        static void CheckStatus(Object state)
        {
            TimerExampleState s = (TimerExampleState)state;
            s.counter++;
            Console.WriteLine("{0} Checking Status {1}.", DateTime.Now.TimeOfDay, s.counter);

            if (s.counter == 5)
            {
                //使用Change方法改變了時間間隔
                (s.tmr).Change(10000, 2000);
                Console.WriteLine("changed");
            }

            if (s.counter == 10)
            {
                Console.WriteLine("disposing of timer");
                s.tmr.Dispose();
                s.tmr = null;
            }
        }
    }
}

運行的結果以下圖:代理

相關文章
相關標籤/搜索