最近在东营做一个超市购物的项目,业务体量很小,是仅供内部员工使用的内网应用程序,其中涉及一个商品数据同步的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. "echo 0 /proc/sys/kernel/hung_task_timeout_secs" disable this message

    问题现象: 问题原因: 默认情况下, Linux会最多使用40%的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的IO请求都是同步的. 将缓存写入磁盘时 ...

  2. 32(2).层次聚类---BIRCH

    BIRCH:Balanced Iterative Reducing and Clustering Using Hierarchies 算法通过聚类特征树CF Tree:Clustering Featu ...

  3. 数组类的创建——DynamicArray.h

    完成DynamicArray类的具体实现 DynamicArray设计要点——类模板 动态确定内部数组空间的大小 实现函数返回数组长度 拷贝构造和赋值操作 DynamicArray类的声明 templ ...

  4. volatile可见性案例-黑马

    volatile可见性案例-黑马 package com.mozq.demo.demo; class Task implements Runnable{ //public boolean flag = ...

  5. java之模板方法设计模式

    抽象类体现的就是一种模板模式的设计.抽象类作为多个子类的通用模板.子类在抽象类的基础上进行扩张和改造,但子类总体上会保留抽象类的行为方式. 解决的问题: 当功能内部一部分实现是确定的,一部分实现是不确 ...

  6. SpringBoot运行异常时捕获

    一.目录展示 二.FirstController 三.ExceptionHandler 捕获异常类 四.效果展示

  7. Spring Boot Redis 解析

    redis使用示例 本示例主要内容 使用lettuce操作redis redis字符串存储(RedisStringController.java) redis对象存储(RedisObjectContr ...

  8. Python中7个不一样的代码写法

    打印index 对于一个列表,或者说一个序列我们经常需要打印它的index,一般传统的做法或者说比较low的写法: 更优雅的写法是多用enumerate 两个序列的循环 我们会经常对两个序列进行计算或 ...

  9. Python迭代器(函数名的应用,新版格式化输出)

    1. 函数名的运用 ​ 你们说一下,按照你们的理解,函数名是什么? ​ 函数名的定义和变量的定义几乎一致,在变量的角度,函数名其实就是一个变量,具有变量的功能:可以赋值:但是作为函数名他也有特殊的功能 ...

  10. Erlang/Elixir精选-第3期(20191216)

    2019年,Erlang社区在应用层上除了aeternity区块链让人印象深刻(Killer App)外,就没有特别出彩的应用出现.在Web,IoT,MessageQueue这些成熟领域,已经有相当成 ...