启动Windows Service的正确方法

时间:2018-10-15 15:57:10

标签: c# visual-studio service windows-services

    #if DEBUG
            MainService service1 = new MainService();
            service1.onDebug();
            System.Threading.Thread.Sleep(System.Threading.Timeout.Infinite);
            ConfigurationSync.logDebugMessage(logMessageType.message, "Starting main service thread");

#else
            ServiceBase[] ServicesToRun;
            ServicesToRun = new ServiceBase[]
            {
                new MainService()
            };
            ServiceBase.Run(ServicesToRun);
            ConfigurationSync.logDebugMessage(logMessageType.message, "Starting main service thread");

#endif

我已经创建了我的第一个Windows服务,我想知道在Program.cs文件中启动该服务的正确方法是什么。

上面提供的代码是由在线tut向我建议的,#if debug在Visual Studio中进行测试时运行,而else块在以发布模式构建并安装在服务器上时运行。 问题是,如果我不使用#if debug代码块中的代码,安装后似乎无法在服务器上运行。 如果我运行上面提供的代码,则表示服务已启动,但似乎没有任何反应,而如果我仅运行debug块中的内容,则该服务将运行,但服务器"Service failed to start in a timely manner"上将出现错误

任何帮助将不胜感激

更新: 在我的mainservice中,我有一个启动该服务所有功能的函数,该函数为startSoftwareUpdates();

这些是我在MainService中拥有的功能:

        public MainService()
    {
        startSoftwareUpdates();

        public void onDebug()
    {

        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        startSoftwareUpdates();
    }

更新3:

因此,我对MainService进行了如下改组:

        public MainService()
    {
        InitializeComponent();
    }

    public void onDebug()
    {

        OnStart(null);
    }

    protected override void OnStart(string[] args)
    {
        new Thread(() =>
        {
            Thread.CurrentThread.IsBackground = true;
            startSoftwareUpdates();
        }).Start();
    }

这种方法可能会导致什么问题?我也希望线程也无限运行...

1 个答案:

答案 0 :(得分:2)

您的代码看起来没有什么错误。如果您可以在az webapp config connection-string set 构造函数中发布更多代码,那么考虑到问题所在可能会有所帮助。

但是,当我构建这些服务时,通常不执行MainService()路由

#if DEBUG

很明显,我不希望这能解决您的问题,因为您上面发布的代码似乎以不同的方式做同样的事情。我发布此消息是为了给您提供一种不同的方式来完成您的上述操作。

如果我不得不猜测,我会说问题出在您的if (Environment.UserInteractive) { //**** this is for debugging in console mode } else { //*** this is for running as a Windows service var ServicesToRun = new ServiceBase[] { new ServiceHome() }; ServiceBase.Run(ServicesToRun); } 构造函数中。

修改

我不认为问题出在您编写的任何代码上。您遇到的错误是由许多潜在问题引起的,因此很难准确地告诉您它是什么。 Here是一个链接,其中包含一些可供您尝试的解决方案。另外,假设您使用的是Windows计算机,则应尝试在MainService中查找错误。大多数情况下,该问题会更加详细。