windows service编程
1 基本概念
1.1windows服务简介
创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序。 这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面。
1.2适用情形
适合在服务器上使用且不需要界面的,长时间稳定运行的情形。
1.3如何安装及卸载服务
1)安装
使用InstallUtil.exe命令,在命令提示符工具中执行安装命令。具体如下
首先,执行命令cd C:\Windows\Microsoft.NET\Framework\v4.0.30319
然后,执行InstallUtil.exe path
其中path为待安装服务应用路径。注意,windows server 2012 使用如下安装命令:.\InstallUtil.exe path
2)卸载
InstallUtil.exe /u path
注意,windows server 2012 使用如下安装命令:
.\InstallUtil.exe /u path
3) 如何管理服务
使用“服务控制管理器”启动、停止、暂停、继续和配置服务,如下图所示:

2 创建服务
2.1四个方法
使用多线程启动、停止、暂停、继续
protected override void OnStart(string[] args):启动
protected override void OnStop():停止
protected override void OnPause():暂停
protected override void OnContinue():继续
2.2 添加安装程序
第一步,双击下图中红框位置。

第二步,在如下的页面中,单击右键。
弹出下图,点击红框位置

第三步,如下界面配置安装程序。

下面两个图的参数含义为:
Account:账户类型。公有四种,入下图

|
成员名称 |
说明 |
|
LocalService |
一个可用作本地计算机上的非特权用户,并向任意远程服务器提供匿名凭据的帐户。 |
|
LocalSystem |
一个帐户,使用服务控制管理器,该本地计算机上拥有许多特权并作为网络上的计算机。 |
|
NetworkService |
提供多种本地特权,并提供给所有远程服务器的计算机的凭据的帐户。 |
|
User |
定义特定用户在网络上的帐户。 指定 User 为 ServiceProcessInstaller.Account 成员会导致系统提示输入有效的用户名和密码时安装了服务,除非您将值设置为 Username 和 Password 属性您 ServiceProcessInstaller 实例。 |
DelayedAutoStart:该值指示服务是否应推迟之前运行其他自动启动的服务无法启动。true 对延迟自动启动服务;否则为 false。 默认值为 false。
Description :解释服务作用的简短注释。
DisplayName :标识服务的名称。
ServiceName :系统用来标识此服务的名称。
ServicesDependedOn :此服务依赖的服务。
StartType :如何以及何时启动此服务。
|
成员名称 |
说明 |
|
Automatic |
指示服务将由(或已由)操作系统在系统启动时启动。 如果一个自动启动的服务依赖于手动启动的服务,则该手动启动的服务也会在系统启动时自动启动。 |
|
Disabled |
指示服务已禁用,因此无法由用户或应用程序启用。 |
|
Manual |
指示服务仅由用户(使用服务控制管理器)或应用程序以手动方式启动。 |


3 一些技巧
3.1 服务名称配置化
获得配置文件中配置的服务名称,代码如下:
public class ServiceNameSetting
{
/// <summary>
/// 服务名称
/// </summary>
/// <returns></returns>
public static string ServiceName
{
get
{
return GetAppConfigText(GetConfigPath("HYMDService.exe.config"), "ServiceName", "HYMDService");
}
}
/// <summary>
/// 获得配置文件路径
/// </summary>
/// <param name="appConfigName">应用程序配置文件名称</param>
/// <returns></returns>
private static string GetConfigPath(string appConfigName)
{
string root = System.Reflection.Assembly.GetExecutingAssembly().Location;
return root.Remove(root.LastIndexOf('\\') + ) + appConfigName;
}
/// <summary>
/// 获得配置节下内容
/// </summary>
/// <param name="configpath">应用程序配置文件路径</param>
/// <param name="strKeyName"><appSettings>配置节下add节点key属性对应值</param>
/// <param name="defaultName">默认服务名称</param>
/// <returns></returns>
private static string GetAppConfigText(string configpath, string strKeyName, string defaultName)
{
if (!string.IsNullOrWhiteSpace(configpath) && !string.IsNullOrWhiteSpace(strKeyName))
{
using (XmlTextReader tr = new XmlTextReader(configpath))
{
while (tr.Read())
{
if (tr.NodeType == XmlNodeType.Element)
{
if (tr.Name == "add" && tr.GetAttribute("key") == strKeyName)
{
return tr.GetAttribute("value");
}
}
}
}
}
return defaultName;
}
}
注意:
上述代码中不使用System.Configuration.ConfigurationManager.AppSettings[Key]读取配置文件是因为,在程序刚启动时此方式不能读取配置文件,所以要用本文中使用的方法。
3.2 长任务暂停与继续
思路:
在OnPause方法中将FlowController.IsToPause = true,表示服务应该暂停。在OnContinue方法中调用FlowController.Continue方法。
在代码中,需要暂停的位置调用FlowController.Pause,当点击“暂停的时候”,发出暂停命令,程序运行到FlowController.Pause方法时便停在此处。
Pause方法中使用AutoEvent.WaitOne()阻塞线程,直到收到信号。
Continue方法中使用AutoEvent.Set()发出信号,允许线程继续执行。
流程控制器,代码如下:
public class FlowController
{
public static bool IsToPause = false;
public static AutoResetEvent AutoEvent = new AutoResetEvent(false); /// <summary>
/// 暂停服务
/// </summary>
public static void Pause(params)
{
//对参数params进行处理
//记录程序暂停了
AutoEvent.WaitOne();
}
/// <summary>
/// 服务继续
/// </summary>
public static void Continue(params)
{
//对参数params进行处理
//记录程序继续了
AutoEvent.Set();
IsToPause = false;
}
}
-----------------------------------------------------------------------------------------
转载与引用请注明出处。
时间仓促,水平有限,如有不当之处,欢迎指正。
windows service编程的更多相关文章
- 关于windows的service编程
最近需要学习下windows的service编程框架,查了下msdn发现不知所云.于是谷歌之,发现了一个非常不错的文章,重点推荐讲的非常详细,深入,看完之后基本上就能很清楚windows的servic ...
- Inno Setup for Windows service
Inno Setup for Windows service? up vote86down votefavorite 77 I have a .Net Windows service. I want ...
- 《Windows核心编程》之“完成端口”(对所有IO都是如此,不仅仅是对socket)
<Windows核心编程>第10章开头部分一再强调:“IO Completion Port”是“构建高性能.可升缩的应用程序”的最佳设施之一,它不仅适用于处理设备IO,也适用于其它越来越多 ...
- .Net Remoting的双向通信和Windows Service的宿主服务
原文:.Net Remoting的双向通信和Windows Service的宿主服务 作为微软分布式技术之一的.Net Remoting,从性能.安全等各方面来说都是相对比较稳定的,也是一项比较成熟的 ...
- C#创建、安装、卸载、调试Windows Service(Windows 服务)的简单教程
前言:Microsoft Windows 服务能够创建在它们自己的 Windows 会话中可长时间运行的可执行应用程序.这些服务可以在计算机启动时自动启动,可以暂停和重新启动而且不显示任何用户界面.这 ...
- 如何利用mono把.net windows service程序迁移到linux上
How to migrate a .NET Windows Service application to Linux using mono? 写在最前:之所以用要把windows程序迁移到Linux上 ...
- 如何托管ASP.NET Core应用到Windows Service中
(此文章同时发表在本人微信公众号"dotNET开发经验谈",欢迎右边二维码来关注.) 题记:正在构思一个中间件的设计,考虑是否既可以使用最新的技术,也可以兼顾传统的部署模式.所以有 ...
- 解决安装mysql的”A Windows service with the name MySQL already exists.“问题
如果以前安装过mysql,卸载重装,很可能会碰到"A Windows service with the name MySQL already exists."这样的提示.即服务已经 ...
- windows多线程编程星球(一)
以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...
随机推荐
- 「mysql优化专题」90%程序员没听过的存储过程和存储函数教学(7)
一.MYSQL储存过程简介(技术文): 储存过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时 ...
- C# Lock、Monitor避免死锁
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 解决iOS手势冲突问题
今天在做一个效果的时候,由于子视图和父视图都有响应的事件,子视图的事件理所当然被父视图拦截掉了,接下来就做分析解决 1. tableviewcell可以触发点击,同时tableview的父视图有点击 ...
- DotNetCasClient 如何获取Cas服务器返回的attributes中的数据
最近开始接触做与其它认证系统的集成,其中有个是与某学校的CAS服务器集成.cas服务器认证成功后返回的数据格式如下: 其中红色部分是我需要取出来用于识别用户身份的数据. 一开始,我根据网上的教程,引用 ...
- xcode 没有 iphone4s 模拟器 的解决方法..
项目需要iphone 4s 测试. 首先是Xcode 8 没有 iphone 4s的模拟器了. 由于线上安装的方式,不管是在code的add simulator 还是 ruby gem 的code-i ...
- spring boot使用profile来区分正式环境配置文件与测试环境配置文件
转载请在页首注明作者与出处 一:前言 经常在开发的时候,项目中的配置文件,在个人开发的时候有一套配置文件,在测试环境有一套配置文件,在正式环境有一套配置文件,这个时候如果配置文件复杂,需要改的东西就特 ...
- Python之禅及释义
在python shell中敲 import this会触发一个彩蛋,神奇的打印下面一段话: The Zen of Python, 即python之禅, 1999年Tim Peters大牛总结的&qu ...
- android之monkey测试
本文同时发表于本人个人网站 www.yaoxiaowen.com monkey测试算是android自动化测试当中最简单的一种工具了.虽然简单,不过对于测试app的稳定健壮,减少崩溃还是比较有用的.所 ...
- robotframework的学习笔记(十四)------学习Robot Framework必须掌握的库—-BuiltIn库
作为一门表格语言,为了保持简单的结构,RF没有像别的高级语言那样提供类似if else while等内置关键字来实现各种逻辑功能,而是提供给了用户BuiltIn库.如果用户想在测试用例中实现比较复杂的 ...
- openldap 编译报错MozNSS not found
openldap 编译报错 1)报错 MozNSS not found - please specify the location to the NSPR and NSS header files i ...