• Windows服务二:测试新建的服务、调试Windows服务


    一、测试Windows服务

    为了使Windows服务程序能够正常运行,我们需要像创建一般应用程序那样为它创建一个程序的入口点。像其他应用程序一样,Windows服务也是在Program.cs的Main()函数中完成这个操作。首先我们在Main()函数中创建一个Windows服务的实例,该实例应该是ServiceBase类的某个子类的对象,然后我们调用由基类ServiceBase类定义的一个Run()方法。然而调用Run()方法并不意味着就开始了Windows服务程序,必须要等到该对象的OnStart()方法被调用时服务才算真正开始运行。如果你想在一个Windows服务程序中同时启动多个服务,那么只要在Main()函数中定义多个ServiceBase类的子类的实例对象就可以了,方法就是创建一个ServiceBase类的数组对象。

     1 namespace WindowsServiceDemo
     2 {
     3     static class Program
     4     {
     5         /// <summary>
     6         /// 应用程序的主入口点。
     7         /// </summary>
     8         static void Main()
     9         {
    10             ServiceBase[] ServicesToRun;
    11             ServicesToRun = new ServiceBase[] 
    12             { 
    13                 //服务1
    14                 new MyService(), 
    15                 //服务2
    16                 new Service1()
    17             };
    18             ServiceBase.Run(ServicesToRun);
    19         }
    20     }
    21 }

    由于Windows服务没有直接的用户交互,服务的状态必须通过记录日志才可知晓。要测试windows服务,可以通过重写服务里面的方法,在方法里面记录日志来实现。

    1、新建Common类,类里面有一个WriteLog记录日志的方法。日志路径写在配置文件里面,可以实现项目的灵活性。

     1 namespace WindowsServiceDemo
     2 {
     3     public class Common
     4     {
     5         /// <summary>
     6         /// 记录日志
     7         /// </summary>
     8         /// <param name="strInfo"></param>
     9         public static void WriteLog(string strInfo)
    10         {
    11             string strPath=ConfigurationManager.AppSettings["FilePath"];
    12             using (StreamWriter sw = new StreamWriter(strPath, true))
    13             {
    14                 sw.WriteLine(strInfo + ",当前时间:" + DateTime.Now.ToString());
    15                 sw.Close();
    16             }
    17             
    18         }
    19     }
    20 }
    View Code

    2、在Service1的设计界面点右键-->查看代码,打开Service1的代码,分别重写OnStart()、OnStop()、OnPause()、OnContinue()方法,在方法里面调用Common类的WriteLog方法来记录服务的运行状态。

     1 namespace WindowsServiceDemo
     2 {
     3     public partial class MyService : ServiceBase
     4     {
     5         public MyService()
     6         {
     7             InitializeComponent();
     8         }
     9 
    10         /// <summary>
    11         /// 服务启动时执行的代码
    12         /// </summary>
    13         /// <param name="args"></param>
    14         protected override void OnStart(string[] args)
    15         {
    16             try
    17             {
    18                 Common.WriteLog("服务启动");
    19             }
    20             catch (Exception ex)
    21             {
    22                 Common.WriteLog("服务启动出错:"+ex.Message);
    23             }
    24         }
    25 
    26         /// <summary>
    27         /// 服务停止时执行的代码
    28         /// </summary>
    29         protected override void OnStop()
    30         {
    31             try
    32             {
    33                 Common.WriteLog("服务停止");
    34             }
    35             catch (Exception ex)
    36             {
    37                 
    38                 Common.WriteLog("服务停止出错:"+ex.Message);
    39             }
    40         }
    41 
    42         /// <summary>
    43         /// 服务暂停时执行的代码
    44         /// </summary>
    45         protected override void OnPause()
    46         {
    47             try
    48             {
    49                 Common.WriteLog("服务暂停");
    50             }
    51             catch (Exception ex)
    52             {
    53                 
    54                  Common.WriteLog("服务暂停出错:"+ex.Message);
    55             }
    56         }
    57 
    58         /// <summary>
    59         /// 服务恢复时执行的代码
    60         /// </summary>
    61         protected override void OnContinue()
    62         {
    63             try
    64             {
    65                 Common.WriteLog("服务恢复");
    66             }
    67             catch (Exception ex)
    68             {
    69                 
    70                  Common.WriteLog("服务恢复出错:"+ex.Message);
    71             }
    72         }
    73 
    74     }
    75 }

    3、在服务控制管理器里面分别启动、暂停、恢复、停止服务,查看生成的日志:

    日志里面正确记录了服务的运行状态,证明服务没有问题。

    二、调试Windows服务

     调试Windows服务,可以采用将服务附加到进程的方法。

    1、在菜单栏选项里面选择调试-->附加到进程

    2、在附加到进程界面,选择相应的服务进程,点击附加。
    注意:要把服务附加到进程,必须保证服务是启动状态,否则在进程里面看不到服务的进程。

    三、总结:
    1、Windows服务调试不能直接F5,可以通过附加到进程方式调试(调试前提:将服务启动、以管理员身份运行VS)
    2、Windows服务由于没有直接的用户交互,服务的状态必须通过日志才可知晓,恰当的加入try catch
    3、所有可能发生变化的内容都不要写死,尽量通过配置文件来实现,这是项目灵活性的重要指标
    4、Windows服务多用于定时操作、大数据量操作、监控操作等方面

  • 相关阅读:
    电路分析
    python-字典
    python-异常
    python-抽象类和抽象方法
    pyqt5-QAbstractScrollArea滚动条
    python-类的继承
    python-语言播报
    pyqt5-QFrame边框样式
    流媒体技术学习笔记之(三)Nginx-Rtmp-Module统计某频道在线观看流的客户数
    让你的 Nginx 的 RTMP 直播具有统计某频道在线观看用户数量的功能
  • 原文地址:https://www.cnblogs.com/dotnet261010/p/6180801.html
Copyright © 2020-2023  润新知