最近在东营作一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的winform应用程序,有一个问题就是服务器重启后,必须登陆服务器操做系统,手动启动才行,因而就想改为一个开机自启动的程序,网上搜了一堆出来,我大体分为两种解决方案:一,把winform改为开机自启,主要思路就是更改注册表,要么直接改注册表,要么把改注册表的代码加在winform程序里。二,把winform应用程序放到任务计划里,或者放到开机自启文件夹里(startup),或者由windows服务开机自启后再启动winform程序。而后分析了一下,改注册表须要重启服务器,现实不太容许,并且winfrom程序,操做系统重启后,必须登陆进来才能打开,通常服务器宕机重启是不会有人立马登进来的,那么未登陆的这段时间数据同步依旧没法执行,而windows 服务开机自启不须要登陆,因此果断放弃winform的同步方式,改为windows服务的方式同步数据,数据同步的主要业务逻辑不变,只是把定时器由winform的System.Windows.Forms.Timer换成了System.Timers。那么如何建立一个windows服务应用程序呢,请继续往下看:windows
1.建立项目,新建服务服务器
打开vs2017,选择 "文件" > "新建" > "项目",在新建项目对话框中,选择Windows服务(.NET Framework),以下图:函数
起个名字:DataAsyncService,点击 "肯定" 按钮。工具
2.添加安装程序spa
弹出一个,啥都没有只有一句话的黑色面板,这是VS自动建立的Service1.cs的文件,此时,右键鼠标,选择 "添加安装程序",会添加一个名叫ProjectInstaller.cs的文件,和两个安装组件ServiceProcessInstaller 和 ServiceInstaller,这时解决方案里有了三个类文件Programe.cs,ProjectInstaller.cs,Service1.cs,以下图:操作系统
如上图,鼠标左键选中左边的serviceProcessInstaller1组件,啥都不要动,而后点击最右侧工具栏的 "属性"(或者按键盘F4键),在 "杂项" 中将Account的值选为 "LocalService",选中serviceInstaller1组件,给Description、DisplayName、ServiceName自定义值,注意:把StartType的值,设置成 "Automatic",即开机自启。(固然也能够安装服务后手动调属性)调试
3.处理业务逻辑日志
选择解决方案里的Service1.cs文件,鼠标右键 "查看代码"(按键盘F7键),在OnStart()方法里写入你要处理的业务逻辑代码,此时Windows服务应用程序建立完毕,点击 "生成" > "生成解决方案",而后就能够打包安装了,是否是有点太简单。。。orm
4.安装Windows服务blog
在 "C:\Windows\Microsoft.NET\Framework\v4.0.30319" 这个路径下,找到 "InstallUtil.exe" 这个可执行文件,复制到项目的生成目录下(bin\Debug),固然你也能够不这样作,我这么作纯属我的习惯,方便执行,以管理员身份运行cmd,进入到项目生成目录下(选择盘符,而后cd 路径),执行如下命令:
InstallUtil.exe DataAsyncService.exe --安装服务
net start 超市购物商品定时同步服务 --启动服务(或手动去服务里启动)
以上,windows服务应用程序所有完成并执行。
中止服务和卸载命令:
net stop 超市购物商品定时同步服务 --中止服务
InstallUtil.exe -u DataAsyncService.exe --卸载服务
5.windows服务启动失败
若是在安装windows服务的时候安装失败,不要担忧,咱们能够找到日志,看看出了什么错,而后根据错误去解决问题。
Ctrl + R,运行里打开 "compmgmt.msc",进入"计算机管理" 界面,依此打开:"系统工具" > "事件查看器" > "Windows日志" > "应用程序",找到刚刚服务启动报的错,找不到就向下滚动一下,很容易找到的,以下图所示,报错详细信息里记录了代码在什么位置抛出异常,根据提示咱们去改相应代码就能够了。
6.windows服务调试
经过以上步骤5咱们能够定位出错位置,那WIndows服务应用程序能不能像控制台或其余程序那样调试呢?Yes Sure!答案是确定的。有两种调试方式,一种是附加到进程,这种方式不能进OnStart()方法,固然有其余方式能够解决,但此处不讨论,这里给出另外一个方式,下断点,而后F5调试。
首先,修改入口函数Main()方法,此方法在Program.cs这个类里,直接上图不bb:
而后修改Service1.cs类里面的OnStart()方法:
修改完以后,在OnStart() 方法里F9(或鼠标点击)打上断点,按F5,此时,进入断点调试,而后一步一步向下执行便可。OK,大功告成。