Лучший отвечающий
ошибка 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();
этот код запускает службу, но работает это только если запустить от имени Администратора, можно ли как то ее запускать без "бубна" ?
Спасибо.
- Изменено i-am-a-kernel 24 октября 2013 г. 21:08
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 28 октября 2013 г. 8:02
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();
этот код запускает службу, но работает это только если запустить от имени Администратора, можно ли как то ее запускать без "бубна" ?
Спасибо.
- Изменено i-am-a-kernel 24 октября 2013 г. 21:08
- Помечено в качестве ответа Maksim MarinovMicrosoft contingent staff, Moderator 28 октября 2013 г. 8:02
24 октября 2013 г. 21:08