Windows服务onStart()未执行

时间:2019-02-12 16:35:46

标签: c# windows-services

我有一个Windows服务,在安装它并从服务菜单中运行它后,在执行Onstart()方法时遇到了麻烦。我记录了执行的每个步骤中发生的一切,以查看问题出在哪里。但是没有错误,它会在main方法中记录并正常运行,直到实际调用该服务以运行,然后它什么都不做。

有趣的是,它在调试中没有任何问题。

我从中调用服务的程序类(起点):

 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测试-作品

     

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)的类似问题,但我不知道它如何解决我的问题。

我的事件查看器也没有记录任何问题,只有有关它的信息才能成功启动。

我很迷茫,所以任何指导都会有所帮助。

1 个答案:

答案 0 :(得分:0)

我发现了问题,这是因为我删除了OnStart()上的覆盖。