>백엔드 개발 >C#.Net 튜토리얼 >C#Win32 콘솔 스레드 타이머 코드 예제에 대한 자세한 소개

C#Win32 콘솔 스레드 타이머 코드 예제에 대한 자세한 소개

黄舟
黄舟원래의
2017-03-11 13:46:051139검색

C#에서는 세 가지 유형의 타이머가 제공됩니다.
1. Windows 기반 표준 타이머(System.Windows.Forms.Timer)
2. 서버 기반 타이머(System.Timers.Timer)
3. 스레드 타이머(System.Threading.Timer)
1. Windows 기반 표준 타이머(System.Windows.Forms.Timer)
가장 먼저 알아두셔야 할 점 Windows 타이머는 단일 스레드 환경을 위해 설계되었습니다
이 타이머는 버전 1.0부터 Visual Basic에 존재했으며 기본적으로 변경되지 않았습니다
이 타이머가 사용됩니다. 가장 간단한 것은 도구 상자의 Timer 컨트롤을 폼으로 끌어서 놓기만 하면 됩니다. , 이벤트 및 간격 속성을 설정합니다.
2. 서버 기반 타이머(System .Timers.Timer)
System.Timers.Timer는 의존하지 않습니다. 스레드 풀에서 스레드를 깨웁니다. 서버 환경에서 실행되도록 최적화된 기존 타이머의 업데이트 버전입니다. VS2008의 도구 상자는 기성 컨트롤을 제공하지 않으며 이 타이머를 사용하려면 수동으로 코딩해야 합니다.
3. 스레드 타이머(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://www.php.cn/
 */
/************************************************************************/
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.