欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C#windows服务创建定时器

程序员文章站 2022-06-09 16:33:53
...

    这几天公司要写一个定时Windows服务需要在下午一点和五点触发,需要调用WebService接口,通过传过来的数据下载客户服务器上的Excel。在网上找了很多关于定时器的文章但是好多都是间隔几分钟触发或者几小时触发。但是没有我所需要的,然后自己找了一篇,给了我灵感,然后用到了自己的项目上。闲话不多说,直接上代码。

Thread ReadFileThread;
        public Service1()
        {
            InitializeComponent();
        }
        protected override void OnStart(string[] args)
        {
            try
            {
                ReadFileThread = new Thread(ReadFileTimer);
                ReadFileThread.Start();
            }
            catch (Exception e)
            {
                Logs.WriteTxTLogs(e.Message);
            }
            
        }
        protected override void OnStop()
        {
            ReadFileThread.Abort();
        }
        private void ReadFileTimer()
        {
            DateTime NowTime = DateTime.Now;
            DateTime time1;//定义触发时间
            try
            {
                if (NowTime.Hour >= 13)
                {
                    time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "13:00:00");
                }
                else
                {
                    time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "13:00:00");
                }
                var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);

                if (NowTime.Hour >= 17)
                {
                    time1 = Convert.ToDateTime(NowTime.AddDays(1).ToString("yyyy-MM-dd ") + "17:00:00");
                }
                else
                {
                    time1 = Convert.ToDateTime(NowTime.ToString("yyyy-MM-dd ") + "17:00:00");
                }
                var timesecond = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);
            }
            catch (Exception e)
            {
                Logs.WriteTxTLogs("ReadFileTimer()错误信息:" + e);
            }
        }

      上面是创建Timer定时器的代码,我在ReadFileTimer方法里创建两个定时器,一个下午一点,另一个下午五点,每天在这两个时间定时执行任务。这两个定时器的主要方法是Timer,我拿一个方法说明一下:

var timefirst = new Timer(new TimerCallback(ReadFile), null, Convert.ToInt32((time1 - NowTime).TotalMilliseconds), 24 * 3600 * 1000);

     Timer的参数:

        第一个参数表示要调用的方法。

        第二个参数是一个包含回调方法要使用的信息的对象,或者为 null,我这里直接写的null。

        第三个参数从代码可以看出是当前时间到触发时间的时间差(以毫秒为单位),主要用于第一次触发,若需要立即执行可写设置为0。如果需要调试可以设置延时触发,延时一分钟可以就写60000,注意是单位毫秒要*1000。

        第四个参数是调用callback的时间间隔。我这里是一天所以写24 * 3600 * 1000。

     顺便简单说一下关于windows服务的调试。我只知道两种方法,一是记录日志,而是直接调试。日志的代码直接放在下面,需要的自取:

/// <summary>
        /// 写文本日志
        /// </summary>
        /// <param name="Message"></param>
        public static void WriteTxTLogs(string Message)
        {
            try
            {
                string logfilename = "Logs.txt";
                string logfilepath = @"D:\GitProject\ReadFile\ReadFile\Logs\" + logfilename;
                if (File.Exists(logfilepath))
                {
                    StreamWriter sw = new StreamWriter(logfilepath, true);
                    sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                    sw.Flush();
                    sw.Close();

                }
                else
                {
                    StreamWriter sw = new StreamWriter(logfilepath, true);
                    sw.WriteLine(DateTime.Now.ToString() + ":" + Message);
                    sw.Flush();
                    sw.Close();
                }
            }
            catch (Exception e)
            {

                throw;
            }
           
        }

        只需改一下文本路径,复制粘贴即可

        第二种直接调试,拿我上一个定时器举例子,设置60s(都是单身老司机手速应该没什么问题),如果不是单身老司机就设置值长一点,然后启动服务,切换到VS点击调试-附加进程-选择自己的服务,点击添加即可(别忘了设断点)。

C#windows服务创建定时器 C#windows服务创建定时器

C#windows服务创建定时器

        OK,在公司呆着无聊,把自己刚做完的东西写一写,希望对别人有帮助。拜拜,下期见。