1. 程式人生 > >C#中的定時器

C#中的定時器

定時器分兩種,一種是阻塞方式,一種是非阻塞

@1.1:阻塞方式的定時器,呼叫sleep使當前執行緒休眠,終端無法輸入字元

    class Program
    {

        static void Main(string[] args)
        {
            while (true)
            {
                Console.Out.WriteLine("1->");
                Thread.Sleep(2000);
            }
        }  
    }

@1.2 :自己的延時函式,當然這種輪詢是不可取的,CPU佔用率會奇高
 class Program
    {
        [DllImport("kernel32.dll")]
        static extern uint GetTickCount(); 

        static void Main(string[] args)
        {
            while (true)
            {
                Console.Out.WriteLine("1->");
             //  Thread.Sleep(2000);
               Delayms(2000);
            }
        }

        //延時delayms毫秒
        static void Delayms(uint delayms)
        {
            uint startms = GetTickCount();
            while (GetTickCount() - startms < delayms){}
        }
    }


@1.3 在網上看到的另一種輪詢程式碼,當然也不可取

        //延時delays秒  
        static void Delays(uint delays)
        {
            DateTime chaoshi = DateTime.Now.AddSeconds(delays); //定義超時時間 當前時間上加上 定義的超時的秒
            DateTime bidui = DateTime.Now;                       //宣告一個比對的時間 這個是當前時間哦
            while (DateTime.Compare(chaoshi, bidui) == 1)      //通過比對函式 DateTime.Compare 比對 定義的超時時間 是不是大於 當前時間 。直到大於的時候才退出迴圈達到延時的目的。
            {
                bidui = DateTime.Now;
            }
        }


@2.1:非阻塞方式,在列印ni值得時候仍然可以列印字串"<--------->",類似於MFC和win32 SDK中的WM_TIMER訊息 
 class Program
    {
        [DllImport("kernel32.dll")]
        static extern uint GetTickCount(); 

        static void Main(string[] args)
        {

            System.Timers.Timer aTimer = new System.Timers.Timer();
            //新增響應函式
            aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
            // 間隔設定為2000毫秒
            aTimer.Interval = 2000;
            aTimer.Enabled = true;

            int ni=0;
            while (true)
            {
                Console.Out.WriteLine(ni++);
                Thread.Sleep(1000);
            }

        }

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

    }