Maison > développement back-end > Tutoriel C#.Net > Introduction détaillée à l'exemple de code du minuteur de thread de console C#Win32

Introduction détaillée à l'exemple de code du minuteur de thread de console C#Win32

黄舟
Libérer: 2017-03-11 13:46:05
original
1152 Les gens l'ont consulté

Trois types de minuteries sont fournis en C# :
1. Minuterie standard basée sur Windows (System.Windows.Forms.Timer)
2. Minuterie basée sur le serveur (System.Timers. Timer)
. 3. Minuterie de fil (System.Threading.Timer)
1. Minuterie standard basée sur Windows (System.Windows.Forms.Timer)
La première chose à noter est que les timers Windows sont conçus pour les environnements monothread
Ce timer existe dans Visual Basic depuis la version 1.0 et est fondamentalement inchangé
Ce timer est utilisé Le plus simple, faites simplement glisser le contrôle Timer dans la boîte à outils sur le formulaire , puis définissez les propriétés de l'événement et de l'intervalle.
2. Minuterie basée sur le serveur (System .Timers.Timer)
System.Timers.Timer ne s'appuie pas sur Il réveille les threads du pool de threads. Il s'agit d'une version mise à jour du minuteur traditionnel optimisé pour fonctionner dans un environnement de serveur. Il n'y a pas de contrôle prêt à l'emploi fourni dans la boîte à outils de VS2008, et vous devez coder manuellement pour l'utiliser. cette minuterie
3. Minuterie de thread (System.Threading.Timer)
Synchronisation des threads La minuterie ne repose pas non plus sur des formulaires. C'est une minuterie simple et légère qui. utilise des méthodes de rappel au lieu d'événements et est pris en charge par les threads du pool de threads. Les minuteurs de thread sont utiles dans les scénarios où les messages ne sont pas envoyés sur un thread.

Ici, nous donnons uniquement des exemples de code pour l'utilisation des timers de thread de console. Plusieurs autres exemples de code seront donnés plus tard :

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;
            }
        }
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal