c#带有Timer的Windows服务不执行代码

Posted

技术标签:

【中文标题】c#带有Timer的Windows服务不执行代码【英文标题】:c# Windows service with Timer not executing code 【发布时间】:2016-01-26 11:47:28 【问题描述】:

我有以下代码,windows服务启动时不执行

我在这里找到了解决方案,但它们对我不起作用。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Configuration;
using System.Threading.Tasks;

namespace TFS_JIRA_sync

    public partial class SyncProcess : ServiceBase
    

        public SyncProcess()
        
            InitializeComponent();
        

        private System.Timers.Timer timer = new System.Timers.Timer();

        protected override void OnStart(string[] args)
        

            this.timer.Interval = ScanPeriod.period * 60000; //turn minutes to miliseconds            
            this.timer.Elapsed += new System.Timers.ElapsedEventHandler(this.OnTimer);//OnTimer;            
            this.timer.Enabled = true;
            this.timer.AutoReset = true;
            this.timer.Start();
        

        private void OnTimer(object sender, System.Timers.ElapsedEventArgs e)
        
            Processing proc = new Processing();
            proc.doProcess();
        

        protected override void OnStop()
        
        
    

在程序中:

using System;
using System.Collections.Generic;
using System.ServiceProcess;
using System.Threading.Tasks;

[assembly: log4net.Config.XmlConfigurator(Watch = true)]


namespace TFS_JIRA_sync

    static class Program
    
        /// <summary>
        /// Главная точка входа для приложения.
        /// </summary>
        static void Main()
        
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[] 
             
                new SyncProcess() 
            ;
            ServiceBase.Run(ServicesToRun);

            //Processing proc = new Processing();
            //proc.doProcess();

        
    

当我在 Programm 类中注释部分开始“ServiceBase[]...”并取消注释“Processing ...”时,它工作正常。

但是当我的代码作为 Windows 服务运行时 - 什么都没有发生

【问题讨论】:

看起来正确(除了设置Enabled 调用Start)。您如何确定它没有正常运行? 在处理类中我有记录器,它记录执行的步骤。当我将程序作为 Win 服务启动时,日志中没有任何反应 【参考方案1】:

据我所知,您的服务不会一直运行 this.timer.Interval = ScanPeriod.period * 60000;。对于您的场景 我建议使用计划任务(正如answer 所建议的那样),而不是使用带有计时器的 Windows 服务(并花时间解决问题)。 它引用了 Jon Gallow 的 article,这说明了为什么最好使用计划任务。

如果您正在编写运行计时器的 Windows 服务,您应该重新评估您的解决方案。

【讨论】:

【参考方案2】:

将 Console.ReadLine() 放入您的代码中:

  static void Main()
    
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
         
            new SyncProcess() 
        ;
        ServiceBase.Run(ServicesToRun);    
        Console.ReadLine();
    

【讨论】:

如果他们试图让他们的代码作为服务运行,那肯定无济于事。他们显示的Main 的未注释位是服务应用程序的标准 Main,由VS 中的“Windows 服务”模板创建。

以上是关于c#带有Timer的Windows服务不执行代码的主要内容,如果未能解决你的问题,请参考以下文章

c#出现timer线程跑丢的情况,网上有说明需要线程重启来解决问题,请提供举例代码。

C#如何在BackgroundWorker 后台线程中使用定时器?

定时任务-C#线程类 windows服务

C# 如何间隔一定的时间执行一次代码?

Windows服务中的Timer Elapsed事件一一

使用定期任务在 C# 中构建 Windows 服务 [重复]