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

  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控制台线程计时器代码示例

  {

  ///

  /// 控制台线程计时器代码示例

  /// 这里展示了Windows API SetConsoleCtrlHandler函数的应用,同时展示了线程计时器的使用;

  /// Author:testcs_dn

  /// Date:2015-01-03

  ///

  class Program

  {

  ///

  /// 计时器回调函数,在这里处理计时时间是否到达的判断以及要做的事情;

  ///

  ///

  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();

  }

  }

  ///

  /// 处理程序例程,在这里编写对指定事件的处理程序代码

  ///

  ///

  ///

  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;

  }

  }

  }

  }