首页 > 解决方案 > Windows 服务 onStart() 未执行

问题描述

我有一个 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 信息测试 - 作品

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 ) 上提出了类似的问题,但我看不出它如何解决我的问题。

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

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

标签: c#windows-services

解决方案


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


推荐阅读