注:服务里的timer

System.Timers.Timer time=new System.Timers.Timer();

 time.Interval = 3000;  //设置计时器事件间隔执行时间

 time.Elapsed += new System.Timers.ElapsedEventHandler(timer1_Elapsed);//添加执行事件

time.Enabled = true;//启用

winForm下的timer控件不能在服务里用

创建Windows Service

1、新建一个Windows Service,并将项目名称改为“MyWindowsService”,如下图所示:

2、在解决方案资源管理器内将Service1.cs改为MyService1.cs后并点击“查看代码”图标按钮进入代码编辑器界面,如下图所示:

3、在代码编辑器内如入以下代码,如下所示:

  1. using System;
  2. using System.ServiceProcess;
  3. using System.IO;
  4.  
  5. namespace MyWindowsService
  6. {
  7. public partial class MyService : ServiceBase
  8. {
  9. public MyService()
  10. {
  11. InitializeComponent();
  12. }
  13.  
  14. string filePath = @"D:\MyServiceLog.txt";
  15.  
  16. protected override void OnStart(string[] args)
  17. {
  18. using (FileStream stream = new FileStream(filePath,FileMode.Append))
  19. using (StreamWriter writer = new StreamWriter(stream))
  20. {
  21. writer.WriteLine($"{DateTime.Now},服务启动!");
  22. }
  23. }
  24.  
  25. protected override void OnStop()
  26. {
  27. using (FileStream stream = new FileStream(filePath, FileMode.Append))
  28. using (StreamWriter writer = new StreamWriter(stream))
  29. {
  30. writer.WriteLine($"{DateTime.Now},服务停止!");
  31. }
  32. }
  33. }
  34. }

4、双击项目“MyWindowsService”进入“MyService”设计界面,在空白位置右击鼠标弹出上下文菜单,选中“添加安装程序”,如下图所示:

5、此时软件会生成两个组件,分别为“serviceInstaller1”及“serviceProcessInstaller1”,如下图所示:

6、点击“serviceInstaller1”,在“属性”窗体将ServiceName改为MyService,Description改为我的服务,StartType保持为Manual,如下图所示:

7、点击“serviceProcessInstaller1”,在“属性”窗体将Account改为LocalSystem(服务属性系统级别),如下图所示:

8、鼠标右键点击项目“MyWindowsService”,在弹出的上下文菜单中选择“生成”按钮,如下图所示:

9、至此,Windows服务已经创建完毕。

三、创建安装、启动、停止、卸载服务的Windows窗体

1、在同一个解决方案里新建一个Windows Form项目,并命名为WindowsServiceClient,如下图所示:

2、将该项目设置为启动项目,并在窗体内添加四个按钮,分别为安装服务、启动服务、停止服务及卸载服务,如下图所示:

3、按下F7进入代码编辑界面,引用“System.ServiceProcess”及“System.Configuration.Install”,并输入如下代码:

  1. using System;
  2. using System.Collections;
  3. using System.Windows.Forms;
  4. using System.ServiceProcess;
  5. using System.Configuration.Install;
  6.  
  7. namespace WindowsServiceClient
  8. {
  9. public partial class Form1 : Form
  10. {
  11. public Form1()
  12. {
  13. InitializeComponent();
  14. }
  15. string serviceFilePath = $"{Application.StartupPath}\\MyWindowsService.exe";
  16. string serviceName = "MyService";
  17.  
  18. //事件:安装服务
  19. private void button1_Click(object sender, EventArgs e)
  20. {
  21. if (this.IsServiceExisted(serviceName)) this.UninstallService(serviceName);
  22. this.InstallService(serviceFilePath);
  23. }
  24.  
  25. //事件:启动服务
  26. private void button2_Click(object sender, EventArgs e)
  27. {
  28. if (this.IsServiceExisted(serviceName)) this.ServiceStart(serviceName);
  29. }
  30.  
  31. //事件:停止服务
  32. private void button4_Click(object sender, EventArgs e)
  33. {
  34. if (this.IsServiceExisted(serviceName)) this.ServiceStop(serviceName);
  35. }
  36.  
  37. //事件:卸载服务
  38. private void button3_Click(object sender, EventArgs e)
  39. {
  40. if (this.IsServiceExisted(serviceName))
  41. {
  42. this.ServiceStop(serviceName);
  43. this.UninstallService(serviceFilePath);
  44. }
  45. }
  46.  
  47. //判断服务是否存在
  48. private bool IsServiceExisted(string serviceName)
  49. {
  50. ServiceController[] services = ServiceController.GetServices();
  51. foreach (ServiceController sc in services)
  52. {
  53. if (sc.ServiceName.ToLower() == serviceName.ToLower())
  54. {
  55. return true;
  56. }
  57. }
  58. return false;
  59. }
  60.  
  61. //安装服务
  62. private void InstallService(string serviceFilePath)
  63. {
  64. using (AssemblyInstaller installer = new AssemblyInstaller())
  65. {
  66. installer.UseNewContext = true;
  67. installer.Path = serviceFilePath;
  68. IDictionary savedState = new Hashtable();
  69. installer.Install(savedState);
  70. installer.Commit(savedState);
  71. }
  72. }
  73.  
  74. //卸载服务
  75. private void UninstallService(string serviceFilePath)
  76. {
  77. using (AssemblyInstaller installer = new AssemblyInstaller())
  78. {
  79. installer.UseNewContext = true;
  80. installer.Path = serviceFilePath;
  81. installer.Uninstall(null);
  82. }
  83. }
  84. //启动服务
  85. private void ServiceStart(string serviceName)
  86. {
  87. using (ServiceController control = new ServiceController(serviceName))
  88. {
  89. if (control.Status == ServiceControllerStatus.Stopped)
  90. {
  91. control.Start();
  92. }
  93. }
  94. }
  95.  
  96. //停止服务
  97. private void ServiceStop(string serviceName)
  98. {
  99. using (ServiceController control = new ServiceController(serviceName))
  100. {
  101. if (control.Status == ServiceControllerStatus.Running)
  102. {
  103. control.Stop();
  104. }
  105. }
  106. }
  107. }
  108. }

4、为了后续调试服务及安装卸载服务的需要,将已生成的MyWindowsService.exe引用到本Windows窗体,如下图所示:

5、由于需要安装服务,故需要使用UAC中Administrator的权限,鼠标右击项目“WindowsServiceClient”,在弹出的上下文菜单中选择“添加”->“新建项”,在弹出的选择窗体中选择“应用程序清单文件”并单击确定,如下图所示:

6、打开该文件,并将<requestedExecutionLevel level="asInvoker" uiAccess="false" />改为<requestedExecutionLevel  level="requireAdministrator" uiAccess="false" />,如下图所示:

7、IDE启动后,将会弹出如下所示的窗体(有的系统因UAC配置有可能不显示),需要用管理员权限打开:

8、重新打开后,在IDE运行WindowsServiceClient项目;

9、使用WIN+R的方式打开运行窗体,并在窗体内输入services.msc后打开服务,如下图所示:

10、点击窗体内的“安装服务”按钮,将会在服务中出现MyService,如下图所示:

11、点击“运行服务”按钮,将启动并运行服务,如下所示:

12、点击“停止服务”按钮,将会停止运行服务,如下图所示:

13、点击“卸载服务”按钮,将会从服务中删除MyService服务。

14、以上启动及停止服务将会写入D:\MyServiceLog.txt,内容如下所示:

源代码下载:

补充:如何调试服务

1、要调试服务,其实很简单,如需将服务附加进程到需要调试的项目里面即可,假如要调试刚才建的服务,现在OnStop事件里设置断点,如下所示:

2、启动“WindowsServiceClient”项目,在“调试”菜单中选择“附件到进程”(服务必须事先安装),如下所示:

3、找到“MyWindowsService.exe”,点击“附加”按钮,如下图所示:

4、点击“停止服务”按钮,程序将会在设置断点的地方中断,如下图所示:

转载自:http://www.cnblogs.com/cncc/p/7170951.html

c# 服务的更多相关文章

  1. solr服务中集成IKAnalyzer中文分词器、集成dataimportHandler插件

    昨天已经在Tomcat容器中成功的部署了solr全文检索引擎系统的服务:今天来分享一下solr服务在海量数据的网站中是如何实现数据的检索. 在solr服务中集成IKAnalyzer中文分词器的步骤: ...

  2. Swift3.0服务端开发(一) 完整示例概述及Perfect环境搭建与配置(服务端+iOS端)

    本篇博客算是一个开头,接下来会持续更新使用Swift3.0开发服务端相关的博客.当然,我们使用目前使用Swift开发服务端较为成熟的框架Perfect来实现.Perfect框架是加拿大一个创业团队开发 ...

  3. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  4. node服务的监控预警系统架构

    需求背景 目前node端的服务逐渐成熟,在不少公司内部也开始承担业务处理或者视图渲染工作.不同于个人开发的简单服务器,企业级的node服务要求更为苛刻: 高稳定性.高可靠性.鲁棒性以及直观的监控和报警 ...

  5. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

  6. 本人提供微软系.NET技术顾问服务,欢迎企业咨询!

    背景: 1:目前微软系.NET技术高端人才缺少. 2:企业很难直接招到高端技术人才. 3:本人提供.NET技术顾问,保障你的产品或项目在正确的技术方向. 技术顾问服务 硬服务项: 1:提供技术.决策. ...

  7. 使用 Roslyn 编译器服务

    .NET Core和 .NET 4.6中 的C# 6/7 中的编译器Roslyn 一个重要的特性就是"Compiler as a Service",简单的讲,就是就是将编译器开放为 ...

  8. C#高性能TCP服务的多种实现方式

    哎~~ 想想大部分园友应该对 "高性能" 字样更感兴趣,为了吸引眼球所以标题中一定要突出,其实我更喜欢的标题是<猴赛雷,C#编写TCP服务的花样姿势!>. 本篇文章的主 ...

  9. 使用ServiceStack构建Web服务

    提到构建WebService服务,大家肯定第一个想到的是使用WCF,因为简单快捷嘛.首先要说明的是,本人对WCF不太了解,但是想快速建立一个WebService,于是看到了MSDN上的这一篇文章 Bu ...

  10. 关于如何提高Web服务端并发效率的异步编程技术

    最近我研究技术的一个重点是java的多线程开发,在我早期学习java的时候,很多书上把java的多线程开发标榜为简单易用,这个简单易用是以C语言作为参照的,不过我也没有使用过C语言开发过多线程,我只知 ...

随机推荐

  1. 大数据开发主战场hive (企业hive应用)

    hive在大数据套件中占很的地位,分享下个人经验. 1.在hive日常开发中,我们首先面对的就是hive的表和库,因此我要先了解库,表的命名规范和原则 如 dwd_whct_xmxx_m 第1部分为表 ...

  2. vue.js 2.0(1)

    1.点击一个按钮打开,关闭弹框 2.实现滚动监听,导航看顶置,实现某元素吸顶 路由

  3. 解决expect自动登录,rz和sz不能使用问题

    一.问题描述: 解决expect自动登录,rz和sz不能使用问题: 二.解决方法: 1. 临时修改环境变量: 将本地的LC_CTYPE环境变量设置成en_US export LC_CTYPE=en_U ...

  4. JavaScript异步编程的Promise模式

    参考: http://www.infoq.com/cn/news/2011/09/js-promise http://www.cnblogs.com/rubylouvre/p/3495286.html ...

  5. JavaScript的文档对象模型DOM

    小伙伴们之前我们讲过很多JavaScript的很多知识点,可以点击回顾一下: <JavaScript大厦之JS运算符>: <JavaScript工作原理:内存管理 + 如何处理4个常 ...

  6. 微信小程序消息通知-打卡考勤

    微信小程序消息通知-打卡考勤 效果: 稍微改一下js就行,有不必要的错误,我就不改了,哈哈! index.js //index.js const app = getApp() // 填写微信小程序ap ...

  7. ruby-attr_accessor使用

    ruby语法-attr_accessor方法使用 本文主要讲解下ruby下attr_accessor方法的使用. 示例1: class Person end person = Person.new p ...

  8. 微信小程序支付接入实战

    1. 微信小程序支付接入实战 1.1. 需求   最近接到一个小程序微信支付的需求,需要我写后台支持,本着能不自己写就不自己写的cv原则,在网上找到了些第三方程序,经过尝试后,最后决定了这不要脸作者的 ...

  9. Android自动化测试之MonkeyRunner使用

    MonkeyRunner工具是使用Jython(使用Java编程语言实现的Python)写出来的,它提供了多个API,通过monkeyrunner API 可以写一个Python的程序来模拟操作控制A ...

  10. jQueryh插件imgareaselect

    1.插件介绍 imgareaselect 是一个 允许用户使用简单.直观的点击.拖动界面图像选择矩形区域的jQuery插件.该插件可用于 web 应用程序中轻松实现图像裁剪功能,以及其他功能,如照片标 ...