C#のタイマー

2498 ワード

タイマーは2種類あり、1つはブロック方式であり、1つは非ブロックである.
@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とwin 32 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("<--------->");
        }

    }