none
我已将潜在不能响应的代码用了线程来启动,为什么还报错:“错误 1053:服务没有及时响应启动或控制请求” RRS feed

  • 问题

  • 我写了一个Windows服务,是一个网络服务,用于Listen一个网络端口,一些Daemon是以线程方式运行的。在命令行时,它能正常接收和回送数据包,但在服务里启动时,报错:“错误 1053:服务没有及时响应启动或控制请求”。

    由于代码由多个文件和库主成,所以我不全贴了:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Diagnostics;
    using System.Linq;
    using System.Net;
    using System.Net.Sockets;
    using System.ServiceProcess;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.IO;
    
    namespace Service
    {
        public partial class ZiKuService : ServiceBase
        {
            ZiKuCenter _zikuCenter;
            Task<bool> StartListen;
            Task<bool> StartProcessRequestPakcets;
            StreamWriter PrintLog;
    
            public ZiKuService()
            {
                InitializeComponent();
                _zikuCenter = new ZiKuCenter();
                PrintLog = new StreamWriter("ZBH.AI.Text.Log", true, Encoding.Default);
    
                BufferSize = 1048576;   //  1MB
    
                LocalIP = new IPEndPoint(new IPAddress(new byte[] { 127, 0, 0, 1 }), 28641);
                SocketInformation Host_SocketInformation = new SocketInformation();
                AI_Listener = new TcpListener(LocalIP);
    
                Console.WriteLine("启动端口服务...");
                Console.WriteLine("本地节点为:" + AI_Listener.LocalEndpoint);
                Console.WriteLine(DateTime.Now.ToLongTimeString() + " 等待连接......");
                
                DaemonThread = new Thread(new ThreadStart(NetworkListenDaemon));
                DaemonThread.IsBackground = true;
                DaemonThread.Start();
                DaemonThread = new Thread(new ThreadStart(Process_RequestObjectQueue_Daemon));
                DaemonThread.IsBackground = true;
                DaemonThread.Start();
                
                /*
                StartListen = NetworkListenDaemon();
                StartProcessRequestPakcets = Process_RequestObjectQueue_Daemon();
                */
                //  end public ZiKuService()
            }
    
            protected override void OnStart(string[] args)
            {
                InitializeComponent();
                _zikuCenter = new ZiKuCenter();
                
                PrintLog = new StreamWriter("ZBH.AI.Text.Log", true, Encoding.Default);
                PrintLog.AutoFlush = true;
    
                BufferSize = 1048576;   //  1MB
    
                LocalIP = new IPEndPoint(new IPAddress(new byte[] { 127, 0, 0, 1 }), 28641);
                SocketInformation Host_SocketInformation = new SocketInformation();
                AI_Listener = new TcpListener(LocalIP);
    
                Console.WriteLine("启动端口服务...");
                Console.WriteLine("本地节点为:" + AI_Listener.LocalEndpoint);
                Console.WriteLine(DateTime.Now.ToLongTimeString() + " 等待连接......");
                
                DaemonThread = new Thread(new ThreadStart(NetworkListenDaemon));
                DaemonThread.IsBackground = true;
                DaemonThread.Start();
                DaemonThread = new Thread(new ThreadStart(Process_RequestObjectQueue_Daemon));
                DaemonThread.IsBackground = true;
                DaemonThread.Start();
                
                /*
                StartListen = NetworkListenDaemon();
                StartProcessRequestPakcets = Process_RequestObjectQueue_Daemon();
                */
                //  end protected override void OnStart(string[] args)
            }
    
            private async Task<bool> StopDaemon()
            {
                NetworkListenDaemon_Exit = true;
                Process_RequestObjectQueue_Daemon_Exit = true;
                //  await StartListen;
                //  await StartProcessRequestPakcets;
                return true;
            }
            protected override void OnStop()
            {
                Task<bool> _StopDaemon = StopDaemon();
                bool returnValue = _StopDaemon.Result;
    
                PrintLog.Flush();
                PrintLog.Close();
                //  end protected override void OnStop()
            }
        }
    }
    
    本来想过用异步,但怀疑这是否是一个正确的方向,因为我将两个死循环

    的Daemon用了线程来启动,并且设定了他们循环推出的标志:

                NetworkListenDaemon_Exit = true;
                Process_RequestObjectQueue_Daemon_Exit = true;

    所以我觉得,不应该出现“不能及时响应”的情况。请大侠,帮忙看看,有啥问题吗?

    2014年3月1日 10:15

答案

  • 你好:

    请参考微软知识库的这篇文章:

    FIX:停止或暂停托管的 Windows 服务时收到“Error 1053:The service did not respond to the start or control request in a timely fashion”(错误 1053:服务没有及时响应启动或控制请求)错误信息

    我之前碰见过类似的问题,原因是在服务的OnStart方法中抛出了异常,但是Windows服务默认直接把异常信息“吞掉”,看不到有异常抛出。当抛出异常之后超过默认的30秒之后就会报这个超时错误。

    建议你调试一下这个Windows Service,通常情况下都是这个原因。关于如何调试,请参考以下博客:

    Windows服务调试


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 OpenNovo 2014年3月4日 4:56
    2014年3月4日 2:38
    版主
  • 其实我忽略了一句话:

            static void Main()
            {
                ServiceBase[] ServicesToRun;
                ServicesToRun = new ServiceBase[] 
                { 
                    new AiService() 
                };
                ServiceBase.Run(ServicesToRun);     //  不能在 命令行 运行
    
                /*
                bool Exit = false;
                while (!Exit)
                {
                    System.Threading.Thread.Sleep(1000);
                }*/
            }

    其实我忽略了:ServiceBase.Run()的重要性,在命令行调试时,我把它标为注释,并用下面的死循环吊死这个程序,来模拟服务。但最终成品时,却没有改过来。所以对初学服务的人,1053貌似就是这个造成的。现在这段代码已经改成正确的了,可以运行了。

    另,还需要补充一下:

    安装好的服务,运行目录是:“C:\Windows\System32",所以代码需要用的文件,都要注意这个问题。

    • 已标记为答案 OpenNovo 2014年3月8日 3:14
    • 已编辑 OpenNovo 2014年3月8日 3:17
    2014年3月8日 3:13

全部回复