在实验室开发一个windows服务~服务写完后,成功安装,但是服务无法启动,提示“错误1053” 服务没有及时地响应启动或控制请求~网上说的将NT AUTHORITY\NetworkService用户添加到Administrator组中的方法没法解决该问题,现将我的服务代码贴上,求C#高手指点!namespace TCPService
{
    public partial class Service1 : ServiceBase
    {
        public class RemoteClient
        {
            private TcpClient client;
            private NetworkStream streamToClient;
            private const int BufferSize = 8192;
            private int seed = 1;
            private string serial;
            private string serialNo;
            private byte[] buffer;
            private SqlConnection conn;
            private SqlCommand comm;
            //private RequestHandler handler;
            public RemoteClient(TcpClient client)
            {                this.client = client;                // 打印连接到的客户端信息 
                //Console.WriteLine("\nClient Connected !{0} <-- {1}",
                //client.Client.LocalEndPoint, client.Client.RemoteEndPoint);
                // 获得流 
                streamToClient = client.GetStream();
                buffer = new byte[BufferSize];
                // 设置RequestHandler 
                //handler = new RequestHandler();
                //  在构造函数中就开始准备读取 
                AsyncCallback callBack = new AsyncCallback(ReadComplete);
                streamToClient.BeginRead(buffer, 0, BufferSize, callBack, null);
            }
            /// <summary>
            /// 再读取完成时进行回调
            /// </summary>
            /// <param name="ar"></param>
            private void ReadComplete(IAsyncResult ar)
            {
                string sqlConn = "Data Source=59.77.16.48;Initial Catalog=ExoonGPSDB; User ID=sa ;Pwd=x3m0u8;Max Pool Size=300; Min Pool Size=10;";
                conn = new SqlConnection(sqlConn);
                int bytesRead = 0;
                try
                {
                    lock (streamToClient)
                    {
                        bytesRead = streamToClient.EndRead(ar);
                        //Console.WriteLine("Reading data, {0} bytes ...", bytesRead);
                    }
                    if (bytesRead == 0) throw new Exception("读取到0 字节");
                    //string str = Regex.Replace(Str, @"\s+", "");//正则是最好的解决办法感觉
                    string msg = Encoding.UTF8.GetString(buffer, 0, bytesRead).Replace("�", "");
                    Array.Clear(buffer, 0, buffer.Length);        //  清空缓存,避免脏读 
                    //string[] msgArray = handler.GetActualString(msg);       // 获取实际的字符串 
                    ////  遍历获得到的字符串 
                    //foreach (string m in msgArray)
                    //{
                    //    Console.WriteLine("Received: {0}", m);
                    //    string back = m.ToUpper();
                    //    //  将得到的字符串改为大写并重新发送 
                    //    byte[] temp = Encoding.Unicode.GetBytes(back);
                    //    streamToClient.Write(temp, 0, temp.Length);
                    //    streamToClient.Flush();
                    //    Console.WriteLine("Sent: {0}", back);
                    //}
                    conn.Open();
                    string strSql = "insert into GPS_DataTra(DataSend) values('" + msg + "')";
                    comm = new SqlCommand(strSql, conn);
                    int count = comm.ExecuteNonQuery();
                    conn.Close();
                    //Console.WriteLine("Received:{0}", msg);
                    string backStr;
                    int command = Convert.ToInt32(msg.Substring(4, 2));     //获取协议命令编码
                    //生成流水号
                    serial = seed.ToString().PadLeft(4, '0');
                    seed++;
                    //根据不同的命令,服务器进行回应
                    switch (command)
                    {
                        case 1: backStr = "*01101" + serial + "#"; break;
                        case 11: backStr = "*01111" + serial + "#"; break;
                        case 23: backStr = "*01123" + serial + "#"; break;
                        case 27: backStr = "*01127" + serial + "#"; break;
                        case 40:
                            {
                                //获取命令流水号
                                serialNo = msg.Substring(6, 4);
                                int devNo = Convert.ToInt32(msg.Substring(10, 2));  //设备总数
                                string devStat = "";    //各个设备状态,设备状态如何确定?
                                devStat = devStat.PadLeft(devNo, '0');
                                int length = 23 + devNo;    //参数包长度
                                string strLength = length.ToString().PadLeft(3, '0');
                                backStr = "*" + strLength + "41" + serialNo + devNo.ToString() + devStat + "005270D735";
                                break;
                            }
                        case 46:
                            {
                                //获取命令流水号
                                serialNo = msg.Substring(6, 4);
                                backStr = "*01146" + serial + "#";
                                break;
                            }
                        default: backStr = msg; break;
                    }
                    byte[] temp = Encoding.UTF8.GetBytes(backStr);
                    streamToClient.Write(temp, 0, temp.Length);
                    streamToClient.Flush();
                    //Console.WriteLine("Sent:{0}", backStr);                    //  再次调用BeginRead(),完成时调用自身,形成无限循环 
                    lock (streamToClient)
                    {
                        AsyncCallback callBack = new AsyncCallback(ReadComplete);
                        streamToClient.BeginRead(buffer, 0, BufferSize, callBack, null);
                    }
                }
                catch (Exception ex)
                {
                    if (streamToClient != null)
                        streamToClient.Dispose();
                    client.Close();
                    //Console.WriteLine(ex.Message);             //  捕获异常时退出程序 
                }
            }
        }
        public Service1()
        {
            InitializeComponent();
        }        protected override void OnStart(string[] args)
        {
            Debugger.Launch();
            //Console.WriteLine("Server is running ... ");
            IPAddress ip = new IPAddress(new byte[] { 192, 168, 1, 103 });
            TcpListener listener = new TcpListener(ip, 29800);
            listener.Start();         // 开始侦听 
           // Console.WriteLine("Start Listening ...");
            while (true)
            {
                // 获取一个连接,同步方法,在此处中断 
                TcpClient client = listener.AcceptTcpClient();
                RemoteClient wapper = new RemoteClient(client);
            }
        }        protected override void OnStop()
        {
        }
    }
}

解决方案 »

  1.   

    OnStart都被你死循环阻塞了,能启动才叫见鬼了...跟权限有个蛋关系...不要在OnStart里写太多代码,更不能死循环...改用异步模型...
      

  2.   

    应该不是你说的这个问题,我把while循环注释了,服务启动错误仍然存在~
      

  3.   

    windows服务编程不是这样搞的,最好但启动一个线程,让onstart马上结束,不然就会阻塞,  private Thread _WorkThread;
      
     protected override void OnStart(string[] args)
     {
        //相关判断
         ....
       _WorkItem = new Thread(new ThreadStart(DoWork))
     }
      private void DoWork()
      {
         ....
      }
      //另外在OnStop方法中,还要想法把工作线程停掉。