У меня также была эта проблема со службой Windows. Я думаю, что вы должны держать логику инициализации менее 30 секунд, в противном случае Windows Service Manager остановит службу.
То, что я сделал, было довольно просто. Я создал метод, в котором я поместил всю сложную логику, которую нужно было выполнить, а затем я создал таймер, который тикает через 20 секунд и выполняет этот метод. Таким образом, служба запустится, затем создаст таймер, инициализирует его с интервалом в 20 секунд и затем завершит инициализацию. Через 20 секунд таймер будет отмечать и запускать бизнес-логику приложения. Конечно, вы можете указать любой интервал времени, который вы хотите.
Вы должны объявить таймер как параметр класса:
public partial class YourService: ServiceBase
{
System.Timers.Timer tmrOnStart;
Затем инициализируйте таймер в методе OnStart
protected override void OnStart(string[] args)
{
//set the interval to 20 seconds
tmrOnStart = new Timer();
tmrOnStart.Interval = 20000;
tmrOnStart.Enabled = true;
tmrOnStart.AutoReset = false;
tmrOnStart.Elapsed += new ElapsedEventHandler(tmrOnStart_Elapsed);
tmrOnStart.Start();
}
Когда таймер вызовет событие Elapsed, он выполнит этот метод:
void tmrOnStart_Elapsed(object sender, ElapsedEventArgs e)
{
heavyBusinessLogicMethod();
}
И вам придется поместить свою логику в метод heavyBusinessLogicMethod.