У меня есть служба 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), но я не вижу, как это решает мою проблему.

Я довольно потерян, поэтому любое руководство поможет.

0