Windows服务无法启动

时间:2014-01-22 09:30:10

标签: c# windows service

这是我的主要内容:

static class Program
{
    static void Main()
    {
        //Debugger.Launch();          
        ServiceBase[] ServicesToRun;
        ServicesToRun = new ServiceBase[] 
        { 
            new Service1() 
        };

        ServiceBase.Run(ServicesToRun);
    }
}

这是我的Service1()代码:

 public partial class Service1 : ServiceBase
{
    public Service1()
    {
        Thread messageThread = new Thread(new ThreadStart(Messaggi.Check));
        messageThread.Start();

        bool checkGruppoIndirizzi = true;

        for (; ; )
        {
            SediOperative.Check();

            Autisti.Check();

            AutistiVeicoli.Check();

            StatiVega.Check();

            int res = Ordini.Check();
            if (res == 0) AssegnazioniVega.Check();

            Thread.Sleep(10000);
        }
    }

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

    protected override void OnStop()
    {
    }
}

首先,我不知道以这种方式启动两个线程是一件好事,但真正的问题是程序在Visual Studio中运行良好但安装后(我使用InstallShield创建了一个安装项目)我尝试从Windows服务面板启动我的服务,然后得到:

Error 1053: The service did not respond to the start or control request in a timely fashion

1 个答案:

答案 0 :(得分:1)

您遇到的问题是,在susyem调用Start方法并且已成功返回后,您的服务将成功启动。鉴于你在构造函数中有一个无限循环,系统会对自己说“甚至不能创建这个,更不用说调用start了。我放弃了。”

您的代码应按以下方式重构:

 public partial class Service1 : ServiceBase
{
    public Service1()
    {
    }
    private Thread messageThread;
    private Thread otherThread;

    private bool stopNow;

    protected override void OnStart(string[] args)
    {
        this.stopNow = false;
        this.messageThread = new Thread(new ThreadStart(Messaggi.Check));
        this.messageThread.Start();

        this.otherThread = new Thread(new ThreadStart(this.StartOtherThread));
        this.otherThread.Start();

    }

    private void StartOtherThread()
    {
        bool checkGruppoIndirizzi = true;

        while (this.stopNow == false)
        {
            SediOperative.Check();

            Autisti.Check();

            AutistiVeicoli.Check();

            StatiVega.Check();

            int res = Ordini.Check();
            if (res == 0) AssegnazioniVega.Check();

            for (int 1 = 0; i < 10; i++)
            {
                if (this.stopNow)
                {
                    break;
                }
                Thread.Sleep(1000);
            }
        }
    }
    }
    protected override void OnStop()
    {
            this.stopNow = true;
        this.messageThread.Join(1000);
        this.otherThread.Join(1000);
    }
}

是的,在Threads上启动东西正是这样做的!你必须有一些方法在Stop()方法中停止它们。 (上面的代码是空气代码所以不要相信它。)对于'otherThread'我已经检查了一个bool并在bool设置时退出。线程。加入只是一个整洁,这不是绝对必要的,但我认为是很好的管家。

干杯 -