У меня есть служба Windows, которая испытывает проблемы с выполнением метода Onstart() после его установки и запуска из меню службы.Я регистрирую все, что происходит на каждом этапе выполнения, чтобы увидеть, где проблема. Но ошибки нет, она регистрируется и нормально работает в основном методе, до тех пор, пока сервис фактически не будет вызван для запуска, а затем он просто ничего не делает.
Интересно отметить, что при отладке не возникает никаких проблем.
Класс моей программы (начальная точка), из которой вызывается сервис:
public class Program
{
private static Container _container;
private static ILogger<Program> _logger;
/// <summary>
/// The main entry point for the application.
/// </summary>
private static void Main()
{
_container = SimpleInjectorContainer.Build(registerConfig: true, useThreadScopedLifestyle: true);
SimpleInjectorContainer.LoggAndVerify(_container);
using (ThreadScopedLifestyle.BeginScope(_container))
{
try
{
_logger = _container.GetInstance<ILogger<Program>>();
_logger.LogInformation("Test - Works");
VerifyConfiguration();
}
catch (Exception ex)
{
var logger = _container.GetInstance<ILogger<Program>>();
logger.LogError(ex, "Configuration is not valid");
throw;
}
if (Environment.UserInteractive)
{
RunDebug();
}
else
{
System.Diagnostics.Debugger.Launch();
_logger.LogInformation("It's Here 49");
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[]
{
_container.GetInstance<SenderService>()
};
_logger.LogInformation("It's Here 56");
//up until here its fine, but it doesn't run the next line
ServiceBase.Run(ServicesToRun);
_logger.LogInformation("It's Here 58");
}
}
}
private static void RunDebug()
{
var senderService = _container.GetInstance<SenderService>();
senderService.TestStart();
Console.WriteLine("Sender Started Debug");
Console.ReadLine();
senderService.TestStop();
}
private static void VerifyConfiguration()
{
var configValidator = _container.GetInstance<IConfigurationValidator>();
configValidator.VerifyOperatorPrefixNumbers();
configValidator.VerifyConfiguration();
configValidator.VerifyOperators();
}
}
Мой фактический сервис:
public partial class SenderService : ServiceBase
{
private readonly Container container;
private readonly ILogger<SenderService> logger;
private readonly ISmsHandlerConfig config;
private readonly IConfigurationValidator configValidator;
public SenderService(
Container container,
ILogger<SenderService> logger,
ISmsHandlerConfig config,
IConfigurationValidator configValidator)
{
this.InitializeComponent();
this.container = container;
this.logger = logger;
this.config = config;
this.configValidator = configValidator;
}
public void TestStart()
{
Console.WriteLine($"Starting {ServiceName} service");
this.OnStart();
}
public void TestStop()
{
Console.WriteLine($"Stopping {ServiceName} service");
this.OnStop();
}
protected void OnStart()
{
try
{
this.logger.LogInformation($"{this.ServiceName} starting");
SmsHandlerAction();
}
catch (Exception ex)
{
this.logger.LogError(ex, $"Error starting service {this.ServiceName}");
throw;
}
}
protected override void OnStop()
{
try
{
this.Dispose();
this.logger.LogInformation($"{this.ServiceName} stopped");
}
catch (Exception ex)
{
this.logger.LogError(ex, $"Error stopping service {this.ServiceName}");
}
}
private void SmsHandlerAction()
{
while (true)
{
this.logger.LogInformation($"{this.ServiceName} started");
using (ThreadScopedLifestyle.BeginScope(this.container))
{
var smsSenderService = this.container.GetInstance<ISmsSenderService>();
var sendResult = smsSenderService.SendSms(this.container);
// Wait if there are not messages for sending
if (!sendResult && this.config.IdleTimeMiliseconds != 0)
{
Thread.Sleep(this.config.IdleTimeMiliseconds);
}
}
}
}
}
это то, что записывается:
2019-02-12 18:02:18.7972 INFO Test - Works
2019-02-12 18:02:20.6370 ИНФОРМАЦИЯ Это здесь 49
2019-02-12 18:02:20.6410 ИНФОРМАЦИЯ Это здесь 56
и после того как я остановлю службу:
2019-02-12 18:02:35.7375 INFO SenderService остановлен
2019-02-12 18:02:35.7375 ИНФОРМАЦИЯ Это здесь 58
Это пропускает this.logger.LogInformation($"{this.ServiceName} starting");
часть.
Он не регистрирует строку в методе onstart, потому что он на самом деле никогда не выполняется, я проверил, работала ли служба, но просто не смог войти, а это не так.
Моя IDE - VS 2017, ОС - Win 7, библиотека DI - SimpleInjector 4.0.12.
Я знаю о подобном вопросе, заданном на stackoverfllow(this), но я не вижу, как это решает мою проблему.
Я довольно потерян, поэтому любое руководство поможет.