Несколько служб Windows в одном проекте = загадка - PullRequest
3 голосов
/ 12 мая 2010

У меня странная проблема, которую я раньше не видел, и я думаю, что она ДОЛЖНА быть чем-то простым, чего я не вижу в своем коде.

У меня есть проект с 2 окнамиуслуги определены.Один я назвал DataSyncService, другой SubscriptionService.Оба добавляются в один и тот же установщик проекта.Оба используют таймер из System.Timers.

Если я запускаю обе службы вместе, кажется, они работают нормально.Таймеры истекают в подходящее время, и все выглядит хорошо.Однако, если я запускаю одну из услуг по отдельности, а другую останавливаю, все идет наперекосяк.Таймер истекает постоянно и на неправильном обслуживании.Другими словами, если я запускаю DataSyncService, таймер SubscriptionService истекает снова и снова.... что, очевидно, странно.

Установка похожа на то, что я делал в прошлом, поэтому я действительно в замешательстве.Я даже пытался удалить оба сервиса и начать все сначала, но, похоже, это не имеет значения.На данный момент, я думаю, что я допустил простую ошибку в определении услуг, и мой мозг просто не дает мне это увидеть.Должно быть, это создает какую-то проблему с многопоточностью, которая заставляет один сервис работать, когда другой останавливается.Вот код ....

Из Program.cs:

static void Main()
    {
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new DataSyncService(),
            new SubscriptionService()

        };
        ServiceBase.Run(ServicesToRun);
    }

Из ProjectInstaller.designer.cs:

private void InitializeComponent()
    {
        this.serviceProcessInstaller1 = new System.ServiceProcess.ServiceProcessInstaller();
        this.dataSyncInstaller = new System.ServiceProcess.ServiceInstaller();
        this.subscriptionInstaller = new System.ServiceProcess.ServiceInstaller();
        // 
        // serviceProcessInstaller1
        // 
        this.serviceProcessInstaller1.Account = System.ServiceProcess.ServiceAccount.LocalSystem;
        this.serviceProcessInstaller1.Password = null;
        this.serviceProcessInstaller1.Username = null;
        // 
        // dataSyncInstaller
        // 
        this.dataSyncInstaller.DisplayName = "Data Sync Service";
        this.dataSyncInstaller.ServiceName = "DataSyncService";
        this.dataSyncInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
        // 
        // subscriptionInstaller
        // 
        this.subscriptionInstaller.DisplayName = "Subscription Service";
        this.subscriptionInstaller.ServiceName = "SubscriptionService";
        this.subscriptionInstaller.StartType = System.ServiceProcess.ServiceStartMode.Automatic;
        // 
        // ProjectInstaller
        // 
        this.Installers.AddRange(new System.Configuration.Install.Installer[] {
        this.serviceProcessInstaller1,
        this.dataSyncInstaller,
        this.subscriptionInstaller});

    }

private System.ServiceProcess.ServiceProcessInstaller serviceProcessInstaller1;
    private System.ServiceProcess.ServiceInstaller dataSyncInstaller;
    private System.ServiceProcess.ServiceInstaller subscriptionInstaller;

Из DataSyncService.cs:

public static readonly int _defaultInterval = 43200000;
    //log4net.ILog log;

    public DataSyncService()
    {
        InitializeComponent();

        //log = LogFactory.Instance.GetLogger(this);
    }

    protected override void OnStart(string[] args)
    {
        timer1.Interval = _defaultInterval; //GetInterval();
        timer1.Enabled = true;
        EventLog.WriteEntry("MyProj", "Data Sync Service Started", EventLogEntryType.Information);
        //log.Info("Data Sync Service Started");
    }

    private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        EventLog.WriteEntry("MyProj", "Data Sync Timer Elapsed.", EventLogEntryType.Information);

    }

private void InitializeComponent()
    {
        this.timer1 = new System.Timers.Timer();
        ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
        // 
        // timer1
        // 
        this.timer1.Enabled = true;
        this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
        // 
        // DataSyncService
        // 
        this.ServiceName = "DataSyncService";
        ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();

    }

Из SubscriptionService:

public static readonly int _defaultInterval = 300000;
    //log4net.ILog log;

    public SubscriptionService()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        timer1.Interval = _defaultInterval; //GetInterval();
        timer1.Enabled = true;
        EventLog.WriteEntry("MyProj", "Subscription Service Started", EventLogEntryType.Information);
        //log.Info("Subscription Service Started");
    }

    private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        EventLog.WriteEntry("MyProj", "Subscription Service Time Elapsed", EventLogEntryType.Information);
    }

private void InitializeComponent()  //in designer
    {
        this.timer1 = new System.Timers.Timer();
        ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
        // 
        // timer1
        // 
        this.timer1.Enabled = true;
        this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
        // 
        // SubscriptionService
        // 
        this.ServiceName = "SubscriptionService";
        ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();

    }

Опять проблема в том, что обработчик timer1_elapsed работает постоянно, когда запускается только одна из служб.И это обработчик службы OPPOSITE.

Кто-нибудь что-нибудь видел?

1 Ответ

3 голосов
/ 12 мая 2010

В файлах метода InitializeComponent () Service.Designer.cs мне не хватает

this.CanShutdown = true; 

... и я не должен включать таймеры там, так как я делаю это в обработчиках OnStart.

Так должно быть что-то вроде:

private void InitializeComponent()
{
    this.timer1 = new System.Timers.Timer();
    ((System.ComponentModel.ISupportInitialize)(this.timer1)).BeginInit();
    // 
    // timer1
    // 

    this.timer1.Elapsed += new System.Timers.ElapsedEventHandler(this.timer1_Elapsed);
    // 
    // DataSyncService
    // 
    this.ServiceName = "DataSyncService";
    this.CanShutdown = true;
    ((System.ComponentModel.ISupportInitialize)(this.timer1)).EndInit();

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...