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

    数据结构有什么用? 现实世界的存储,我们使用的工具和建模.每种数据结构有自己的优点和缺点,想想如果Google的数据用的是数组的存储,我们还能方便地查询到所需要的数据吗?而算法,在这么多的数据中如何做 ...

  2. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  3. [译]Vulkan教程(32)生成mipmap

    [译]Vulkan教程(32)生成mipmap Generating Mipmaps 生成mipmap Introduction 入门 Our program can now load and ren ...

  4. 推荐几本高质量的Python书籍--附github下载路径

    一 为什么要分享? 最近碰到了一些人和事,感触挺大的.就是发现很多类似自己的软件工程师,一旦工作三五年之后,工作中算是一个熟练工,但是进步的脚步突然慢了下来,虽然你在工作中仍旧很努力.到底是什么原因呢 ...

  5. 编码方式ASCII、GBK、Unicode、UTF-8比较

    文章内容深度较浅,详细了解可到下链接:https://blog.csdn.net/QuinnNorris/article/details/78705723; 总结了以下几种编码方式: ASCII.GB ...

  6. SpringCloud 服务间互相调用 @FeignClient注解

    SpringCloud搭建各种微服务之后,服务间通常存在相互调用的需求,SpringCloud提供了@FeignClient 注解非常优雅的解决了这个问题 首先,保证几个服务都在一个Eureka中注册 ...

  7. go语言之数组

    1.go语言的数组和python的列表不一样,python的列表没有限定类型,而go的数组限定的类型,理由是这样的,请看下面的图 go语言的数组会数组中第一个值的内存地址,在我们上面的例子中,数组中的 ...

  8. 解决CentOS7 Local time比实际时间相差8小时

    GPS系统中有两种时间区分,UTC就0时区的时间,CST为本地时间,如北京为早上八点(东八区),UTC时间比北京时晚八小时; CST:China Standard Time,UTC+8:00 中国沿海 ...

  9. Python 调用 Hprose接口、Dubbo接口、Java方法

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  10. C#深入浅出之数据类型

    基本数据类型        C#支持完整的BCL(基类库)名字,但是最好都统一使用关键字进行使用与开发,比如使用int而不是System.Int32,以及使用string类型时候应当使用string而 ...