最近在东营做一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的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. Appium使用总结

    目前在使用appium过程中遇到的一些问题及规避方法总结如下: Appium使用总结:1.在熄屏下启动测试,会自动唤醒屏幕2.Appium只针对单个应用测试3.使用unittest框架,该框架中每条用 ...

  2. [洛谷P1122][题解]最大子树和

    这是一道还算简单的树型dp. 转移方程:f[i]=max(f[j],0) 其中i为任意非叶节点,j为i的一棵子树,而每棵子树都有选或不选两种选择 具体看代码: #include<bits/std ...

  3. pwn-200

    题目连接 https://adworld.xctf.org.cn/media/task/attachments/49bd95c78386423997fa044a9e750015 借鉴 https:// ...

  4. mysql数据库创建用户、赋权、修改用户密码

    创建新用户 create user lisi identified by '123456'; 查看创建结果: 授权 命令格式:grant privilegesCode on dbName.tableN ...

  5. 【ES6学习笔记之】Object.assign()

    基本用法 Object.assign方法用于对象的合并,将源对象(source)的所有可枚举属性,复制到目标对象(target). const target = { a: 1 }; const sou ...

  6. Jedis & spring-data-redis

    当我们了解了redis的五大数据类型,手动去敲一敲每个数据类型对应的命令,无论是再来看jedis,还是spring-data-redis都是很轻松的,他们提供的API都是基于原生的redis命令,可读 ...

  7. 常用类-excel转csv

    public class ExcelFileHelper { public static bool SaveAsCsv(string excelFilePath, string destination ...

  8. goweb- 对请求的处理

    对请求的处理 Go 语言的 net/http 包提供了一系列用于表示 HTTP 报文的结构,我们可以使用它 处理请求和发送相应,其中 Request 结构代表了客户端发送的请求报文,下面让我们看 一下 ...

  9. Locust压测结果准确性验证

    最近闲着没事做,就重新研究了一下基于python语言的Locust性能测试框架 发现在压测的过程中,虽然设置了100并发,但是通过实际监控,完全看不到100并发压测的效果 通过代码AOP日志监控接口的 ...

  10. go语言中strings包常用方法

    strings.HasPrefix(s string, prefix string) bool:判断字符串s是否以prefix开头 strings.HasSuffix(s string, suffix ...