【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文章系列——系列文章目录以及简要介绍

时间: 2024-10-11 00:10:48

【Window Service】关于Window Service的两三事的相关文章

CentOS 7 防火墙 出现Failed to start iptables.service: Unit iptables.service failed to load

错误信息如下: [root]# service iptables start Redirecting to /bin/systemctl start iptables.service Failed to start iptables.service: Unit iptables.service failed to load: No such file or directory.解决方法如下: 一直用CentOS 6 习惯了,一下没适应过来.防火墙配置后执行service iptables sav

关于window.onload,window.onbeforeload与window.onunload

★  window.onload  当页面加载完毕的时候执行,即在当前页面进行其他操作之前执行.如,刚进入某个网页的弹窗提示. (  与window.onload相近的可以参考我写的另外一篇记录"比较body.onload(function()).$(document).ready(function())与$(windows).load(function)"  ) ★  window.onbeforeunload 与 window.onunload 的比较 window.onbefor

解读Android之Service(2)Bound Service

翻译自android官方文档,并根据自己测试形成下面的内容. 这是service的第二部分bound service.若第一部分没看的,请参考:上一篇. bound service 相当于客户-服务器接口中的服务器.bound service 允许其它组件(除了broadcast receiver)绑定该service,然后进一步操作:发送请求,接收响应,甚至IPC.bound service 只有在其他组件绑定它时才处于存活状态,且会受到绑定它的组件影响. 下面将具体介绍如何创建bound s

window.showModalDialog 与window.open传递参数的不同?

简单的说,就是一个在弹出窗口之后可以做其它的事,即window.open 另一个在弹出窗口之后不能做其它的事,只能是关闭了当前的窗口之后才能做其它的事,即window.showModalDialog 那么两者在使用上有什么不同呢?他们分别是如何和父窗口进行交互的呢? 先来看window.showModalDialog的例子: 我这里现在有一个父窗体parent.jsp,它里面有一个方法 function openChild(){                var temp = window.

js实现跨域(jsonp, iframe+window.name, iframe+window.domain, iframe+window.postMessage)

一.浏览器同源策略 首先我们需要了解一下浏览器的同源策略,关于同源策略可以仔细看看知乎上的一个解释.传送门 总之:同协议,domain(或ip),同端口视为同一个域,一个域内的脚本仅仅具有本域内的权限,可以理解为本域脚本只能读写本域内的资源,而无法访问其它域的资源.这种安全限制称为同源策略. ( 现代浏览器在安全性和可用性之间选择了一个平衡点.在遵循同源策略的基础上,选择性地为同源策略"开放了后门". 例如img script style等标签,都允许垮域引用资源.) 下表给出了相对 

window.open()与window.showModalDialog

弹出窗口两种方式:    1.window.showModalDialog:      var feature = "dialogWidth:615px;dialogHeight:505px;status:no;help:no;scroll:no;resizable:no;center:yes";      window.showModalDialog(url, Object(传给弹出窗口的参数,可以是任何类型),feature)       决定窗口的外观是第三个参数feature,

window.btoa 和 window.atob

前一段时间被安全部门查出,明文传递密码,被要求整改. 然后就进行了引入了第三方的base64编码的js库,进行了编码然后传递. 其实在前端的加密都是寻求一个心理安慰,作用是微乎其微的,确实也更加好那么一点. 今天在看 filer 无意看到了 btoa和atob. 这不就是内置的base64编码和解码么,那么接下来有两个问题 兼容性和中文的支持情况 兼容性 兼容性IE10以上和其他浏览器都支持,还是相对不错的,要是移动端都支持. 借两张 MDN的图片,要是真遇到IE怎么办,引入polyfill库,

window.parent与window.opener的区别与使用

window.parent 是iframe页面调用父页面对象 举例: a.html 如果我们需要在b.html中要对a.html中的username文本框赋值(就如很多上传功能,上传功能页在ifrmae中,上传成功后把上传后的路径放入父页面的文本框中), 我们应该在b.html中写: var _parentWin = window.parent;_parentWin.form1.username.value = "xxxx"; window.opener 是 window.open 打

window.top、window.parent、window.open、window.opener

地址:http://blog.csdn.net/zdwzzu2006/article/details/6047632 在应用有frameset或者iframe的页面时,parent是父窗口,top是最顶级父窗口(有的窗口中套了好几层frameset或者iframe),self是当前窗口, opener是用open方法打开当前窗口的那个窗口. window.self 功能:是对当前窗口自身的引用.它和window属性是等价的. 语法:window.self 注:window.self.window

JavaScript(Iframe、window.open、window.showModalDialog)父窗口与子窗口之间的操作

一.Iframe 篇 公共部分 //父对象得到子窗口的值 //ObjectID是窗口标识,ContentID是元素ID function GetValue(ObjectID,ContentID) { var IsIE = (navigator.appName == 'Microsoft Internet Explorer') if(IsIE) {//如果是IE alert(document.frames(ObjectID).document.getElementById(ContentID).i