Я написал службу Windows на С#, которая в основном проверяет мой db каждую минуту для заказов, генерирует PDF из этих заказов и отправляет его по электронной почте.
Логика отлично работает в моих тестах и т.д.
Когда я создаю службу и устанавливаю ее с помощью проекта установки, когда я иду для запуска службы в сервисах mmc, я получаю:
ошибка 1053 служба не ответила на запрос запуска или управления своевременно
Мой метод OnStart выглядит следующим образом:
protected override void OnStart(string[] args)
{
//writeToWindowsEventLog("Service started", EventLogEntryType.Information);
timer.Enabled = true;
}
В принципе, просто включает таймер... так что там нет интенсивного процесса.
Где я иду не так?
Я попытался настроить учетную запись запуска на локальную систему, службу сети и т.д.... ничего не работает!
Edit:
Вот мой код: (processPurchaseOrders - это метод, в котором запрашивается db, и PDF генерируются и т.д.)
public partial class PurchaseOrderDispatcher : ServiceBase
{
//this is the main timer of the service
private System.Timers.Timer timer;
public PurchaseOrderDispatcher()
{
InitializeComponent();
}
// The main entry point for the process
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() };
ServiceBase.Run(ServicesToRun);
#else //debug code
PurchaseOrderDispatcher service = new PurchaseOrderDispatcher();
service.processPurchaseOrders();
#endif
}
private void InitializeComponent()
{
this.CanPauseAndContinue = true;
this.ServiceName = "Crocus_PurchaseOrderGenerator";
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
//turn off the timer.
timer.Enabled = false;
}
protected override void OnPause()
{
timer.Enabled = false;
base.OnPause();
}
protected override void OnContinue()
{
timer.Enabled = true;
base.OnContinue();
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
processPurchaseOrders();
}
}