c #Windows服务,Timer没有执行代码

时间:2015-10-27 06:58:04

标签: c# .net windows-services system.timers.timer

我有以下代码,在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();

        }
    }
}

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

但是当我的代码作为Windows服务运行时 - 没有任何事情发生

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

因为我看到你的服务不会一直运行 this.timer.Interval = ScanPeriod.period * 60000;。适合您的场景 我建议使用计划任务(按照answer的建议),而不是使用计时器的Windows服务(并花时间解决问题)。 它引用了Jon Gallow的article,它提供了很多理由说明为什么使用计划任务会更好。

  

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