请教windows服务问题!急!
在实验室开发一个windows服务~服务写完后,成功安装,但是服务无法启动,提示“错误1053” 服务没有及时地响应启动或控制请求~网上说的将NT AUTHORITY\NetworkService用户添加到Administrator组中的方法没法解决该问题,现将我的服务代码贴上,求C#高手指点!--------------------编程问答-------------------- OnStart都被你死循环阻塞了,能启动才叫见鬼了...跟权限有个蛋关系...
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()
{
}
}
}
不要在OnStart里写太多代码,更不能死循环...改用异步模型... --------------------编程问答-------------------- 楼上有理,顶, --------------------编程问答--------------------
应该不是你说的这个问题,我把while循环注释了,服务启动错误仍然存在~ --------------------编程问答--------------------
windows服务编程不是这样搞的,最好但启动一个线程,让onstart马上结束,不然就会阻塞,
--------------------编程问答-------------------- 忘了敲_WorkItem.start()
private Thread _WorkThread;
protected override void OnStart(string[] args)
{
//相关判断
....
_WorkItem = new Thread(new ThreadStart(DoWork))
}
private void DoWork()
{
....
}
//另外在OnStop方法中,还要想法把工作线程停掉。
补充:.NET技术 , C#