在C#中提供了三種類型的計時器:
1、基於Windows 的標準計時器(System.Windows.Forms.Timer)
2、基於伺服器的計時器(System.Timers. Timer)
3、執行緒計時器(System.Threading.Timer)
一、基於Windows 的標準計時器(System.Windows.Forms.Timer)
首先註意一點就是:Windows 計時器是為單線程環境設計的
此計時器從Visual Basic 1.0 版起就存在於該產品中,並且基本上未做改動
這個計時器是使用最簡單的一種,只要把工具箱中的Timer控制項拖曳到窗體上,然後設定一下事件和間隔時間等屬性就可以了
二、基於伺服器的計時器(System .Timers.Timer)
System.Timers.Timer不依賴窗體,是從線程池喚醒線程,是傳統的計時器為了在伺服器環境上運行而優化後的更新版本,在VS2008的工具箱中沒有提供現成的控件,需要手工編碼使用此計時器
#三、線程計時器(System.Threading.Timer)
#線程計時器也不依賴窗體,是一種簡單的、輕量級計時器,它使用回調方法而不是使用事件,並由執行緒池執行緒提供支援。對訊息不在線程上發送的方案中,線程計時器是非常有用的。
這裡只針對控制台執行緒計時器的使用給出程式碼範例,後續會給出其它幾種的程式碼範例:
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using System.Text; using System.Threading; /************************************************************************/ /* CSharp控制台线程计时器代码示例 * Powered by:testcs_dn * Blog://m.sbmmt.com/ */ /************************************************************************/ namespace CSharp控制台线程计时器代码示例 { /// <summary> /// 控制台线程计时器代码示例 /// 这里展示了Windows API SetConsoleCtrlHandler函数的应用,同时展示了线程计时器的使用; /// Author:testcs_dn /// Date:2015-01-03 /// </summary> class Program { /// <summary> /// 计时器回调函数,在这里处理计时时间是否到达的判断以及要做的事情; /// </summary> /// <param name="obj"></param> public static void workOvertimeTimerCallback(object obj) { DateTime dt = DateTime.Now; if (dt.Hour == 16 && dt.Minute > 0) { Console.WriteLine("ok"); } } //计时器变量 public static System.Threading.Timer workOvertimeTimer = null; //定义处理程序委托 delegate bool ConsoleCtrlDelegate(int dwCtrlType); const int CTRL_CLOSE_EVENT = 2; //导入SetCtrlHandlerHandler API [DllImport("kernel32.dll")] private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add); static void Main(string[] args) { ConsoleCtrlDelegate newDelegate = new ConsoleCtrlDelegate(HandlerRoutine); if (SetConsoleCtrlHandler(newDelegate, true)) { //初始化计时器 workOvertimeTimer = new System.Threading.Timer(new TimerCallback(workOvertimeTimerCallback), null, 1000, 10000); //这里执行你自己的任务,我举例输出“...”,为了展示长时间的任务,我用了一个死循环; //避免输出太多,使用了Sleep; //注意:Sleep的时间不可太长,否则可能影响Console.ReadKey(),导致不能接收用户输入; while (true) { Console.WriteLine("..."); Thread.Sleep(100); } } else { Console.WriteLine("抱歉,API注入失败,按任意键退出!"); Console.ReadKey(); } } /// <summary> /// 处理程序例程,在这里编写对指定事件的处理程序代码 /// </summary> /// <param name="CtrlType"></param> /// <returns></returns> static bool HandlerRoutine(int CtrlType) { switch (CtrlType) { case CTRL_CLOSE_EVENT: //用户要关闭Console了 Console.WriteLine(); Console.WriteLine("任务还没有完成,确认要退出吗?(Y/N)"); ConsoleKeyInfo ki = Console.ReadKey(); return ki.Key == ConsoleKey.Y; default: return true; } } } }
以上是詳細介紹C#Win32控制台執行緒計時器程式碼範例的詳細內容。更多資訊請關注PHP中文網其他相關文章!