DOTNET程序员应该掌握的Windows服务编程「终于解决」

DOTNET程序员应该掌握的Windows服务编程「终于解决」1基本概念1.1windows服务简介创建在它们自己的Windows会话中可长时间运行的可执行应用程序。

欢迎大家来到IT世界,在知识的湖畔探索吧!

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

管理服务

使用“服务控制管理器”启动、停止、暂停、继续和配置服务,如下图所示:

DOTNET程序员应该掌握的Windows服务编程「终于解决」

2 创建服务

2.1四个方法

使用多线程启动、停止、暂停、继续

protected override void OnStart(string[] args):启动

protected override void OnStop():停止

protected override void OnPause():暂停

protected override void OnContinue():继续

2.2 添加安装程序

第一步,双击下图中红框位置。

DOTNET程序员应该掌握的Windows服务编程「终于解决」

第二步,在如下的页面中,单击右键。

DOTNET程序员应该掌握的Windows服务编程「终于解决」

弹出下图,点击红框位置

DOTNET程序员应该掌握的Windows服务编程「终于解决」

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

DOTNET程序员应该掌握的Windows服务编程「终于解决」

下面两个图的参数含义为:

Account:账户类型。公有四种,如下图

DOTNET程序员应该掌握的Windows服务编程「终于解决」

DOTNET程序员应该掌握的Windows服务编程「终于解决」

DelayedAutoStart:该值指示服务是否应推迟之前运行其他自动启动的服务无法启动。true 对延迟自动启动服务;否则为 false。 默认值为 false。

Description :解释服务作用的简短注释。

DisplayName :标识服务的名称。

ServiceName :系统用来标识此服务的名称。

ServicesDependedOn :此服务依赖的服务。

StartType :如何以及何时启动此服务。

DOTNET程序员应该掌握的Windows服务编程「终于解决」

DOTNET程序员应该掌握的Windows服务编程「终于解决」

DOTNET程序员应该掌握的Windows服务编程「终于解决」

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('\\') + 1) + 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;
 }
	}

欢迎大家来到IT世界,在知识的湖畔探索吧!

注意:

上述代码中不使用System.Configuration.ConfigurationManager.AppSettings[Key]读取配置文件是因为,在程序刚启动时此方式不能读取配置文件,所以要用本文中使用的方法。

3.2 长任务暂停与继续

思路:

在OnPause方法中将FlowController.IsToPause = true,表示服务应该暂停。在OnContinue方法中调用FlowController.Continue方法。

在代码中,需要暂停的位置调用FlowController.Pause,当点击“暂停的时候”,发出暂停命令,程序运行到FlowController.Pause方法时便停在此处。

Pause方法中使用AutoEvent.WaitOne()阻塞线程,直到收到信号。

Continue方法中使用AutoEvent.Set()发出信号,允许线程继续执行。

流程控制器,代码如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!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;
 }
 }

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/18347.html

(0)
上一篇 2023年 6月 12日 下午8:00
下一篇 2023年 6月 16日 下午12:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信