最近在东营做一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的winform应用程序,有一个问题就是服务器重启后,必须登录服务器操作系统,手动启动才行,于是就想改成一个开机自启动的程序,网上搜了一堆出来,我大致分为两种解决方案:一,把winform改成开机自启,主要思路就是更改注册表,要么直接改注册表,要么把改注册表的代码加在winform程序里。二,把winform应用程序放到任务计划里,或者放到开机自启文件夹里(startup),或者由windows服务开机自启后再启动winform程序。然后分析了一下,改注册表需要重启服务器,现实不太允许,而且winfrom程序,操作系统重启后,必须登录进来才能打开,一般服务器宕机重启是不会有人立马登进来的,那么未登录的这段时间数据同步依旧无法执行,而windows 服务开机自启不需要登录,所以果断放弃winform的同步方式,改成windows服务的方式同步数据,数据同步的主要业务逻辑不变,只是把定时器由winform的System.Windows.Forms.Timer换成了System.Timers。那么如何创建一个windows服务应用程序呢,请继续往下看:

  1.创建项目,新建服务

  打开vs2017,选择 "文件" > "新建" > "项目",在新建项目对话框中,选择Windows服务(.NET Framework),如下图:

  

  起个名字:DataAsyncService,点击 "确定" 按钮。

  2.添加安装程序

   弹出一个,啥都没有只有一句话的黑色面板,这是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服务应用程序创建完毕,点击 "生成" > "生成解决方案",然后就可以打包安装了,是不是有点太简单。。。

  

  4.安装Windows服务

  在 "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,大功告成。

  

C# windows服务,解决应用程序开机自启问题的更多相关文章

  1. MongoDB安装并设置为windows服务以使其开机自启

    在MongoDB的官方下载windows平台的压缩zip文件,地址:https://www.mongodb.org/dr/fastdl.mongodb.org/win32/mongodb-win32- ...

  2. Windows 操作系统如何使程序开机自启

    Windows 操作系统如何开机自启 一.前言: 作为一只运维开发,很多时候需要将自己的小工具做开机自启.在 Linux 的世界里,如果你希望一个程序可以开机自启,那么可以在/etc/rc.d/rc. ...

  3. vs 2010创建Windows服务定时timer程序

    vs 2010创建Windows服务定时timer程序: 版权声明:本文为搜集借鉴各类文章的原创文章,转载请注明出处:  http://www.cnblogs.com/2186009311CFF/p/ ...

  4. 制作Windows服务和安装程序(C#版)

    http://blog.sina.com.cn/s/blog_5f4ffa170100vt2b.html 1.创建服务项目: 打开VS 2005 编程环境,在C#中新建Windows服务程序 2.将安 ...

  5. Linux中程序开机自启

    Linux中程序开机自启 https://www.itbulu.com/debian-ubuntu-rclocal.html

  6. windows服务与自启动程序的区别(转载)

    转载:http://blog.csdn.net/anddy926/article/details/8464142 在客户端服务器项目实践中,作为服务端必须保持程序的24小时不间断运行,需要做一个监控, ...

  7. 为C# Windows服务添加安装程序

    最近一直在搞Windows服务,也有了不少经验,感觉权限方面确定比一般程序要受限很多,但方便性也很多.像后台运行不阻塞系统,不用用户登录之类.哈哈,扯远了,今天讲一下那个怎么给Windows服务做个安 ...

  8. 第十三篇 一个安装、管理windows服务的桌面程序

    在网上看到一个修改程序入口的程序去把windows 服务修改成控制台的程序,然后利用控制台的程序把服务安装和管理,也想起自己原来也写了一个对windows 报务管理的程序,不过是winform的.   ...

  9. 基于Windows服务的聊天程序(一)

    本文将演示怎么通过C#开发部署一个Windows服务,该服务提供各客户端的信息通讯,适用于局域网.采用TCP协议,单一服务器连接模式为一对多:多台服务器的情况下,当客户端连接数超过预设值时可自动进行负 ...

随机推荐

  1. shell 得到当前目录路径

    shell 得到当前目录路径 cd "$(dirname $0)" project=$(pwd | cut -d / -f ) echo 'project: '$project c ...

  2. json解决ajax跨域的原理

    jsonp只能解决GET类型的ajax请求跨域问题 jsonp请求不是ajax请求,而是一般的get请求 基本原理 浏览器端: 动态生成<script>来请求后台接口(src就是接口的ur ...

  3. 国产处理器的逆袭机会——RISC-V

    前言 今天天气阴沉,刚才又下起了小雨,温度骤降,前几天脱下的秋裤,今天又穿上了,这天气真是变化无常.上周六(4.20)参加了一场关于RSIC-V的技术沙龙,第一次真正了解了RISC-V架构,正好今天不 ...

  4. Linux之自动化部署

    No.1 自动化部署git项目 一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一一 ...

  5. 用户APC的执行过程

    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html 用户APC的执行过程 一.一个启发式问题 有一个问题,线程什么时候 ...

  6. SpringMVC参数绑定,这篇就够了!

    SpringMVC参数绑定,简单来说就是将客户端请求的key/value数据绑定到controller方法的形参上,然后就可以在controller中使用该参数了 下面通过5个常用的注解演示下如何进行 ...

  7. java基础(3):变量、运算符

    1. 变量 1.1 变量概述 前面我们已经学习了常量,接下来我们要学习变量.在Java中变量的应用比常量的应用要多很多.所以变量也是尤为重要的知识点! 什么是变量?变量是一个内存中的小盒子(小容器), ...

  8. Python爬虫实战教程:爬取网易新闻

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: Amauri PS:如有需要Python学习资料的小伙伴可以加点击 ...

  9. [转]Paste from Excel into C# app, retaining full precision

    本文转自:https://stackoverflow.com/questions/8614910/paste-from-excel-into-c-sharp-app-retaining-full-pr ...

  10. 常用adb命令总结

    前言 很早就想整理一下自己平时常用的一些adb命令,不仅为了便于以后查找,而且整理的过程自己又重新复习了一遍,但是当我开始在度娘一搜的时候,发现很多人已经写的非常详细了,尤其是当我发现了这篇adb概括 ...