好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

C#实现的Win32控制台线程计时器功能示例

本文实例讲述了C#实现的Win32控制台线程计时器功能。分享给大家供大家参考,具体如下:

在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:http://blog.csdn.net/testcs_dn

  */

/************************************************************************/

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#程序设计有所帮助。

dy("nrwz");

查看更多关于C#实现的Win32控制台线程计时器功能示例的详细内容...

  阅读:46次