none
ошибка 1053 при запуске службы Windows

    Вопрос

  • Для решения задачи необходимо в фоне регулярно выполнять задачу, но при запуске получается ошибка 1053 "Служба не ответила на запрос своевременно"

    Вот код службы:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;
    using ControlPanel;
    using System.IO;
    
    namespace OAMaker
    {
        public partial class OAMaker : ServiceBase
        {
            public OAMaker()
            {
                InitializeComponent();
            }
    
    
            private System.Timers.Timer mainTimer;
            BlowFishCS.BlowFish crypto = new BlowFishCS.BlowFish(ControlPanel.Properties.Settings.Default.secretKey);
    
            protected override void OnStart(string[] args)
            {
                AddLog("Service is UP: " + DateTime.Now.ToString());
                this.mainTimer = new System.Timers.Timer();
                this.mainTimer.Enabled = true;
                this.mainTimer.Interval = 1000;
                this.mainTimer.Elapsed += new System.Timers.ElapsedEventHandler(this.mainTimer_Elapsed);
                this.mainTimer.AutoReset = true;
                this.mainTimer.Start();
            }
    
            protected override void OnStop()
            {
                this.mainTimer.Stop();
                AddLog("Service is DOWN: " + DateTime.Now.ToString());
            }
    
            public void AddLog(string log)
            {
                try
                {
                    if (!EventLog.SourceExists("MyExampleService"))
                        EventLog.CreateEventSource("MyExampleService", "MyExampleService");
                    eventLog1.Source = "MyExampleService";
                    eventLog1.WriteEntry(log);
                }
                catch
                {
                }
            }
    
            private void mainTimer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
            {
                Thread thread = new Thread(new ThreadStart(Process));
                thread.Start();
            }
    
            private void Process()
            {
                using (var db = new DataBaseContext())
                {
                    var query = (from c in db.Register select c.path);
                    List<string> listFiles = new List<string>(query);
                    int counter = 0;
                    foreach (string str in listFiles)
                    {
                        string tmp = crypto.Decrypt_CBC(str);
    
                        if (!File.Exists(tmp))
                        {
                            db.Register.Remove((from c in db.Register where c.path == str select c).FirstOrDefault());
                        }
                        else
                        {
                            listFiles[counter] = tmp;
                            counter++;
                            AddLog(tmp);
                        }
                    }
                }
            }
    
        }
    }
    

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

    Возможно кто то сталкивался, или знает как решить данную проблему. Спасибо.

    24 октября 2013 г. 16:01

Ответы

  • Вопрос решился. Оказалось что лучше 

    BlowFishCS.BlowFish crypto = new BlowFishCS.BlowFish(ControlPanel.Properties.Settings.Default.secretKey);


    объявлять в методе ) сглупил.

    но появился другой вопрос, обшарил везде где мог: есть приложение из которого можно запустить службу или остановить

     ServiceController service = new ServiceController("makerBackup");
                if ((service.Status.Equals(ServiceControllerStatus.Stopped)) ||
                    (service.Status.Equals(ServiceControllerStatus.StopPending)))
                    service.Start();
                else service.Stop(); 

    этот код запускает службу, но работает это только если запустить от имени Администратора, можно ли как то ее запускать без "бубна" ?

    Спасибо.


    24 октября 2013 г. 21:08

Все ответы

  • Нашел ошибку в своем коде, проблема в том что таймер запускался в OnStart() создавая цикл, попался. используя stackoverflow исправил код, но что то снова не так, ошибка та же. 
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;
    using ControlPanel;
    using System.IO;
    using System.Timers;
    
    namespace OAMaker
    {
        public partial class OAMaker : ServiceBase
        {
            public OAMaker()
            {
                InitializeComponent();
            }
    
    
            private System.Timers.Timer mainTimer;
            BlowFishCS.BlowFish crypto = new BlowFishCS.BlowFish(ControlPanel.Properties.Settings.Default.secretKey);
    
            protected override void OnStart(string[] args)
            {
                AddLog("Service is UP: " + DateTime.Now.ToString());
                Thread thread = new Thread(new ThreadStart(this.InitTimer));
                thread.Start();
            }
    
            protected override void OnStop()
            {
                this.mainTimer.Enabled = false;
                AddLog("Service is DOWN: " + DateTime.Now.ToString());
            }
    
            public void AddLog(string log)
            {
                try
                {
                    if (!EventLog.SourceExists("MyExampleService"))
                        EventLog.CreateEventSource("MyExampleService", "MyExampleService");
                    eventLog1.Source = "MyExampleService";
                    eventLog1.WriteEntry(log);
                }
                catch
                {
                }
            }
    
    
            private void InitTimer()
            {
                mainTimer = new System.Timers.Timer();
                mainTimer.Elapsed += new System.Timers.ElapsedEventHandler(mainTimer_Elapsed);
                double timeInSeconds = 3.0;
                mainTimer.Interval = (timeInSeconds * 1000);
                mainTimer.AutoReset = true;
                mainTimer.Enabled = true;
                mainTimer.Start();
            }
    
            protected void mainTimer_Elapsed(object sender, ElapsedEventArgs e)
            { 
                using (var db = new DataBaseContext())
                {
                    var query = (from c in db.Register select c.path);
                    List<string> listFiles = new List<string>(query);
                    int counter = 0;
                    foreach (string str in listFiles)
                    {
                        string tmp = crypto.Decrypt_CBC(str);
    
                        if (!File.Exists(tmp))
                        {
                            db.Register.Remove((from c in db.Register where c.path == str select c).FirstOrDefault());
                        }
                        else
                        {
                            listFiles[counter] = tmp;
                            counter++;
                            AddLog(tmp);
                        }
                    }
                }
            }
    
        }
    }
    

    24 октября 2013 г. 19:40
  • Вопрос решился. Оказалось что лучше 

    BlowFishCS.BlowFish crypto = new BlowFishCS.BlowFish(ControlPanel.Properties.Settings.Default.secretKey);


    объявлять в методе ) сглупил.

    но появился другой вопрос, обшарил везде где мог: есть приложение из которого можно запустить службу или остановить

     ServiceController service = new ServiceController("makerBackup");
                if ((service.Status.Equals(ServiceControllerStatus.Stopped)) ||
                    (service.Status.Equals(ServiceControllerStatus.StopPending)))
                    service.Start();
                else service.Stop(); 

    этот код запускает службу, но работает это только если запустить от имени Администратора, можно ли как то ее запускать без "бубна" ?

    Спасибо.


    24 октября 2013 г. 21:08