C#中的定時器
阿新 • • 發佈:2019-01-10
定時器分兩種,一種是阻塞方式,一種是非阻塞
@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("<--------->"); } }