詳細介紹C#Win32控制台執行緒計時器程式碼範例

黄舟
發布: 2017-03-11 13:46:05
原創
1119 人瀏覽過

在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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!