zoukankan      html  css  js  c++  java
  • 【Window Service】关于Window Service的两三事

    引言 

         Window Service通常用于寄宿WCF服务或者定时作业.下面记录一下它的用法.

    创建

        创建Window Service项目后,可以看到Program和Service1类.Program是程序的主入口,而Service1则是我们逻辑实现的主要地方 ,两个关键方法是OnStart和OnStop,用于实现服务启动和结束时的逻辑.

    安装

       在Service1类的设计界面上右击,选择添加安装程序,就可以完成了安装程序的创建.

    Nlog

       Window Service作为一个后台程序,发生了什么错误很难获取的信息的,所以需要做个日志记录.下面做个示例,每3秒输出日志记录.

       1.打开NuGet程序包管理界面,输入Nlog搜索,安装其中的Nlog和Nlog Configuration,接着在NLog.config做下修改,如下

    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
                layout="${longdate} ${uppercase:${level}} ${message}" />
    
        <target xsi:type="Console" name="c" layout="[${longdate}][${level:uppercase=true}][${logger}]${message}${exception}" />
    
      </targets>
    
      <rules
        <logger name="*" minlevel="Debug" writeTo="f,c" />
      </rules>

      2.在Service1中使用Timer和Nlog类,实现每3秒输出日志记录,如下

      public partial class Service1 : ServiceBase
        {
            readonly Logger logger = LogManager.GetCurrentClassLogger();
            readonly Timer timer=new Timer();
            public Service1()
            {
                InitializeComponent();
            }
            protected override void OnStart(string[] args)
            {
                timer.AutoReset = true;
                timer.Interval = 3000; //单位毫秒
                timer.Elapsed+=timer_Elapsed;
                timer.Start();
            }
            protected override void OnStop()
            {
                timer.Stop();
            }
            private void timer_Elapsed(object sender, ElapsedEventArgs e)
            {
                logger.Info(DateTime.Now.ToShortTimeString());
            }
            //下面两个方法是为了方便调试而创建
            public void Start()
            {
                OnStart(null);
    
            }
            public void Stop()
            {
                OnStop();
            }
        }

    部署

        下面是安装和卸载脚本,分别保存成Bat文件,放在程序的根目录就可以.

    @echo 安装服务
    set svc_file=%cd%WindowsServiceDemo.exe
    sc create Service1 binpath= "%svc_file%" displayName= "Service1" depend= tcpip start= auto
    net start Service1
    @pause
    @exit
    
    
    @echo 卸载服务
    net stop Service1
    sc delete Service1
    @pause
    @exit

    调试
        VS貌似没有提供给Window Service调试的工具,要测试只能通过实际部署才能看到效果,但是可以利用TopShell寄宿服务来达到调试的目的.

        1. http://topshelf-project.com/   可以下到最新的类库

        2.新建一个控制台程序,引用上面的服务,TopShell,Nlog,就可以编码了,如下

    class Program
        {
            static void Main(string[] args)
            {
                HostFactory.Run(x =>
                {
                    x.UseNLog();
    
                    x.Service<Service1>(s =>
                    {
                        s.ConstructUsing(name => new Service1());
                        s.WhenStarted(tc => tc.Start());
                        s.WhenStopped(tc => tc.Stop());
                    });
    
                    x.SetServiceName("Service1");
                    x.SetDisplayName("Service1");
                    x.SetDescription("每3秒记录日志");
                    x.RunAsLocalSystem();
                    x.StartAutomatically();
                });
    
            }

         3.运行控制台程序,可以看到

     

    小结

       本文简单介绍了Window Service从创建到调试的步骤.如有更好的建议,请不吝指教.

    参考资料

        C# 编写Windows Service(windows服务程序)

        使用Topshelf创建Windows 服务

        NLog文章系列——系列文章目录以及简要介绍

  • 相关阅读:
    剑指Offer34 数组中的逆序对
    剑指Offer33 第一个只出现一次的字符
    剑指Offer32 丑数
    剑指Offer31 把数组排成最小的数
    剑指Offer30 从1到n整数出现1的个数
    剑指Offer29 连续子数组最大和
    剑指Offer28 最小的K个数(Partition函数应用+大顶堆)
    DNS的递归查询和迭代查询
    剑指Offer27 数组中超过一半的数
    剑指Offer26 字符串的全排列
  • 原文地址:https://www.cnblogs.com/caizl/p/4639674.html
Copyright © 2011-2022 走看看