• Windows服务程序的编写、调试、部署


    基本概念

    什么是Windows服务?作为.net开发人员,平常写的都是winform程序或者asp.net程序,可能对Windows服务程序接触的不多,下面我摘了个百度文献的解释给大家:

    Microsoft Windows 服务(即以前的NT服务)使您能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。这使服务非常适合在服务器上使用,或任何时候,为了不影响在同一台计算机上工作的其他用户,需要长时间运行功能时使用。还可以在不同于登录用户的特定用户帐户或默认计算机帐户的安全上下文中运行服务

     

    如何编写

    使用Visual stduio编写一个windows服务其实很简单,但是安装和调试相对麻烦一些。

    1. 新建一个windows Service项目

     

    2. 编写服务运行代码

    项目建立完毕以后,VS自动创建了程序启动类program.cs,和一个继承于ServiceBaseService1类,当然我们可以修改Service1适当的类名,比如我这里就改为

    DemoService然后可以在方法OnStart里填充我们需要该服务运行的代码,比如我这里就启动一个时钟,让它隔10秒就干点什么事

    public partial class DemoService : ServiceBase

        {

            public DemoService()

            {

                InitializeComponent();

            }

            System.Timers.Timer timer;

            protected override void OnStart(string[] args)

            {

                timer = new System.Timers.Timer(10000);

                timer.Enabled = true;

                timer.Elapsed +=new System.Timers.ElapsedEventHandler(timer_Elapsed);

            }

            private void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)

            {

                // dosomethting();

            }

            protected override void OnStop()

            {

               timer.Enabled = false;

            }

     }

     

    3. 服务的安装运行

     

    3.1. 为了使服务能安装运行起来,我们还要添加一个安装类,如Installer1

     

    3.2. 打开Installer1组件的设计界面,我们从工具箱里把两个组件ServiceInstallerServiceProcessInstaller拖到界面上,如果你的工具箱没有这两个组件,那么需要右击工具箱选择Choose Items.net 类库里添加到工具箱。

    3.3. ServiceInstaller主要用于定义服务属性,如ServiceName(这个很重要),DisplayName,服务的启动方式StartType(自动启动,手动启动,不启动),不要忘了parent指向Installer1

    3.4. ServiceProcessInstaller则用于指定运行服务时使用的用户身份,一般选择LocalSystem,同样需要把Parent设为Installer1

    3.5. 编译成功后,打开VSComand Prompt,进入项目的bin\debug目录下,运行命令InstallUtil.exe DemoService.exe,服务安装成功后,运行命令”net start  DemoService”即可启动服务了(这里DemoService便是前面设置的ServiceName)

    4. 服务的调试

    由于windows服务不能像普通应用程序那样在VS里通过debug启动,所以要进入调试状态也麻烦一些,必须以上述方式启动服务后,在VS里通过ToolsàAttach Process,把服务进程加载进来,然后就可以设置断点和普通应用程序一样调试了。

    5. 服务的停止和卸载

    3.5类似,服务的停止命令是net stop  DemoService,卸载的命令是InstallUtil.exe  /u DemoService.exe,卸载服务前必须先停止服务。当然,服务安装成功后,你也可以到   开始à程序à管理工具à服务  里找到该服务,通过右键菜单进行启动和停止,或者修改其启动类型。

    6. 我的服务安装与启动的批处理命令

    Windows的安装与启动是不是原始和繁琐了?尤其是在程序还在修改过程中的时候,反复的安装卸载或者启动停止,非常麻烦,所以我写了几个批处理文件。

     

    6.1 install.bat先停止服务(如果已存在),然后卸载,安装,启动。当服务第一次安装或者重新安装的时候均可使用此命令。 内容如下:

    net stop DemoService

    InstallUtil.exe /u DemoService.exe

    InstallUtil.exe   DemoService.exe

    net start  DemoService

    6.2 unstall.bat,就是卸载指定服务,内容如下:

    net stop DemoService

    InstallUtil.exe /u DemoService.exe

    6.3 start.bat,启动服务内容如下:

    net start  DemoService

    6.4 停止服务内容如下:

    net stop DemoService

    6.5 InstallUtil.exe C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727目录里拷贝出来,与上述批处理文件,服务可执行文件DemoService.exe放置于同一目录下,现在,一点鼠标就能对服务进行安装卸载启动停止各种操作了。

    服务的优点与用途

    如前面所言,windows服务适合用来运行一些长时间执行的程序,不需要过多的人为干预,没有前台界面,不容易受界面操作影响,相比于普通应用程序稳定性较好。对于一些自动定时执行的程序,或者一些服务性程序,都适合使用windows服务,比如我前面编写的自动任务执行程序,又或者Remoting服务。

  • 相关阅读:
    web.xml中<web-app>报错
    groovy初体验:groovy在java中的应用
    Mac安装JMeter时Unable to access jarfile ./ApacheJMeter.jar 解决方法
    intellij idea中解决java.lang.VerifyError: Expecting a stackmap frame at branch target的方法
    关于go get无法安装国内被墙软件解决办法
    Oracle 序列
    无锁并发框架Disruptor学习入门
    vsftp服务器部署
    FinalShell 推荐
    supperset (python 2.7.12 + mysql)记录
  • 原文地址:https://www.cnblogs.com/lindping/p/2510661.html
Copyright © 2020-2023  润新知