1

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 サービスとして実行されると、何も起こりません

4

2 に答える 2

0

ご覧のとおり、サービスは常に実行されるわけではありません this.timer.Interval = ScanPeriod.period * 60000;。あなたのシナリオでは、タイマー付きの Windows サービスを使用する (そして問題の解決に時間を費やす) のではなく、スケジュールされたタスクを使用することをお勧めします (この回答で提案されているように)。これは、Jon Gallow の記事を参照しており、スケジュールされたタスクを使用する方が良い理由がたくさんあります。

タイマーを実行する Windows サービスを作成している場合は、ソリューションを再評価する必要があります。

于 2015-10-27T08:14:31.273 に答える
0

コードに Console.ReadLine() を挿入します。

  static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new SyncProcess() 
        };
        ServiceBase.Run(ServicesToRun);    
        Console.ReadLine();
    }
于 2015-10-27T07:17:08.463 に答える