1

我按照此处标记答案中的说明创建了服务。该服务已正确安装。当我在一段时间后启动该服务时,它会抛出一条消息“Windows 无法在本地计算机上启动 xxx 服务。

错误 1053:服务未及时响应启动或控制请求。"

单击确定后,其状态将永远保持在“正在启动”。当我检查应用程序和系统日志时,没有错误。

当我检查 SQL 跟踪时,该服务实际上正在正确运行并且正在执行它应该做的事情。那么为什么它的状态停留在“Starting”呢?

更新:这是 OnStart 方法中的代码

 protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();
            loader.StartProcess();
        }

更新 2:

根据 WiktorZychla 的评论,我这样做了,它奏效了 :)

protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();

            ThreadStart threadDelegate = new ThreadStart(loader.StartProcess);
            Thread newThread = new Thread(threadDelegate);
            newThread.Start();

        }
4

3 回答 3

6

根据 WiktorZychla 的评论,这就是我所做的

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using IndexLoader;
using System.Threading;

namespace myNameSpace
{
    public partial class LoaderService : ServiceBase
    {
        Thread newThread;
        public LoaderService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)
        {

            Loader loader = new Loader();

            ThreadStart threadDelegate = new ThreadStart(loader.StartProcess);
            newThread = new Thread(threadDelegate);
            newThread.Start();

        }

        protected override void OnStop()
        {
            if ((newThread != null) && (newThread.IsAlive))
            {


                Thread.Sleep(5000);
                newThread.Abort();

            }
        }
    }
}
于 2012-05-29T21:13:34.713 回答
5

确切地了解您的OnStart()方法中的内容将是有益的。该OnStart()方法是来自操作系统的回调,用于启动您的服务,但它必须在 30 秒左右内返回(我记得在某处读过)。否则,操作系统会给出您所看到的消息。简而言之,将OnStart()方法限制为初始化事物,并将您的服务要执行的实际工作推迟到某种线程。

于 2012-05-26T17:29:56.853 回答
1

Main()函数的 Program.cs 文件中,确保您具有:

ServiceBase.Run(new ServiceClassHere());

在创建一个保存的 Windows 窗体应用程序时,我曾多次感到内疚

Application.Run(new Class());在我的Main()功能中

于 2012-05-25T20:08:42.700 回答