2025年3月27日 星期四 甲辰(龙)年 月廿六 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > .net

C# windows服务启动与暂停

时间:11-09来源:作者:点击数:26

启动对应的是OnStart

停止对应的是OnStop

下面是如何启动一个服务,本次例子服务是写一个服务端的socket通信

  • protected override void OnStart(string[] args)
  • {
  • serverSocket = new Socket(SocketType.Stream, ProtocolType.Tcp);
  • IPAddress ip = IPAddress.Any;
  • IPEndPoint point = new IPEndPoint(ip, 8978);
  • //socket绑定监听地址
  • serverSocket.Bind(point);
  • //Console.WriteLine("Listen Success");
  • //设置同时连接个数
  • serverSocket.Listen(10);
  • //利用线程后台执行监听,否则程序会假死
  • Thread thread = new Thread(Listen);
  • thread.IsBackground = true;
  • thread.Start(serverSocket);
  • Log.WriteLog(Log.LogLevel.INFO, "Listen:", "Start");
  • }
  • /// <summary>
  • /// 监听连接
  • /// </summary>
  • /// <param name="o"></param>
  • static void Listen(object o)
  • {
  • var serverSocket = o as Socket;
  • while (true)
  • {
  • //等待连接并且创建一个负责通讯的socket
  • var send = serverSocket.Accept();
  • //获取链接的IP地址
  • var sendIpoint = send.RemoteEndPoint.ToString();
  • Log.WriteLog(Log.LogLevel.INFO, "Connected:", sendIpoint.ToString());
  • //开启一个新线程不停接收消息
  • Thread thread = new Thread(Recive);
  • thread.IsBackground = true;
  • thread.Start(send);
  • }
  • }
  • /// <summary>
  • /// 接收消息
  • /// </summary>
  • /// <param name="o"></param>
  • static void Recive(object o)
  • {
  • try
  • {
  • var send = o as Socket;
  • while (true)
  • {
  • //获取发送过来的消息容器
  • byte[] buffer = new byte[1024 * 1024 * 2];
  • var effective = send.Receive(buffer);
  • //Log.WriteLog(Log.LogLevel.INFO, "RemoteEndPoint:", send.RemoteEndPoint.ToString());
  • //有效字节为0则跳过
  • if (effective == 0)
  • {
  • Log.WriteLog(Log.LogLevel.INFO, "effective", effective.ToString());
  • break;
  • }
  • var str = Encoding.UTF8.GetString(buffer, 0, effective);
  • if (!str.Equals("[S]HeartBeat[E]"))
  • Log.WriteLog(Log.LogLevel.INFO, "received:", str + send.RemoteEndPoint.ToString());
  • //Console.WriteLine(str);
  • DevComm.sendSocket = send;
  • string strRet = devComm.CommandProc(str, send);
  • //if (!str.Equals("[S]HeartBeat[E]"))
  • // Log.WriteLog(Log.LogLevel.INFO, "received:", str + send.RemoteEndPoint.ToString() + " return ");
  • //var buffers = Encoding.UTF8.GetBytes(strRet);
  • //Log.WriteLog(Log.LogLevel.INFO, "Send:", strRet);
  • //send.Send(buffers);
  • }
  • }
  • catch (Exception e)
  • {
  • Log.WriteLog(Log.LogLevel.ERROR, "Connected:", "Disconnected" + e.Message.ToString());
  • try
  • {
  • if (IsExistsService(serviceName))
  • {
  • LaunchService(serviceName);
  • }
  • Log.WriteLog(Log.LogLevel.INFO, "服务遇到异常后重新启动成功:", e.Message.ToString());
  • }
  • catch (Exception ex)
  • {
  • Log.WriteLog(Log.LogLevel.INFO, "服务遇到异常后重新启动失败:", ex.Message.ToString());
  • }
  • }
  • }

下面是如何暂停方法,暂停和停止都要先判断该服务是否存在

  • protected override void OnStop()
  • {
  • serverSocket.Close();
  • Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "开始");
  • try
  • {
  • if (IsExistsService(serviceName))
  • {
  • StopService(serviceName);
  • }
  • Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "成功");
  • }
  • catch (Exception ex)
  • {
  • Log.WriteLog(Log.LogLevel.INFO, "服务停止状态", "失败" + ex.Message.ToString());
  • }
  • }
  • #region 判断服务是否存在
  • private static bool IsExistsService(string serviceName)
  • {
  • /* 另一种方法
  • 得到当前计算机所有服务对象
  • serviceController[] serviceControllers = ServiceController.GetServices();
  • 通过服务名【ServiceName】(非显示服务名DisplayServiceName) 得到服务对象①
  • ServiceController serviceController = serviceControllers.SingleOrDefault(s => s.ServiceName == serviceName);
  • */
  • foreach (ServiceController sc in ServiceController.GetServices())
  • {
  • if (sc.ServiceName.ToUpper() == serviceName.ToUpper())
  • {
  • return true;
  • }
  • }
  • return false;
  • }
  • #endregion
  • #region
  • private static void InstallService(string serviceProgramPath)
  • {
  • using (AssemblyInstaller installer = new AssemblyInstaller())
  • {
  • installer.UseNewContext = true;
  • installer.Path = serviceProgramPath;
  • IDictionary saveState = new Hashtable();
  • installer.Install(saveState);
  • installer.Commit(saveState);
  • }
  • }
  • #endregion
  • #region 启动服务
  • private static void LaunchService(string serviceName)
  • {
  • using (ServiceController currentService = new ServiceController(serviceName))
  • {
  • if (currentService.Status == ServiceControllerStatus.Stopped)
  • {
  • currentService.Start();
  • }
  • }
  • }
  • #endregion
  • #region 停止服务
  • private void StopService(string serviceName)
  • {
  • using (ServiceController service = new ServiceController(serviceName))
  • {
  • if (service.Status == ServiceControllerStatus.Running)
  • {
  • service.Stop();
  • }
  • }
  • }
  • #endregion

service对应的是服务名称,startType可以设置服务的启动类型

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门