首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Windows服务onStart()未执行

Windows服务onStart()未执行
EN

Stack Overflow用户
提问于 2019-02-12 16:35:46
回答 1查看 193关注 0票数 0

在安装Onstart()方法并从服务菜单中运行它之后,我有一个windows服务在执行Onstart()方法时遇到了问题,我正在记录在执行的每一步发生的所有事情,以查看问题所在。但是没有错误,它在主方法中记录并运行良好,直到服务实际被调用来运行,然后它就什么也不做了。

值得注意的是,它在调试中没有任何问题。

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

代码语言:javascript
复制
 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();

    }
}

我的实际服务:

代码语言:javascript
复制
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,OS是Win 7,DI库是SimpleInjector 4.0.12。

我知道stackoverfllow(this)上有一个类似的问题,但我看不出它是如何解决我的问题的。

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

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

EN

回答 1

Stack Overflow用户

发布于 2019-02-13 09:21:49

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54658236

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档