前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >windows service编程

windows service编程

作者头像
甜橙很酸
发布2018-03-08 11:27:38
1.4K0
发布2018-03-08 11:27:38
举报
文章被收录于专栏:DOTNETDOTNETDOTNET

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

注意:

上述代码中不使用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;
        }
    }

-----------------------------------------------------------------------------------------

时间仓促,水平有限,如有不当之处,欢迎指正。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 基本概念
    • 1.1windows服务简介
      • 1.2适用情形
        • 1.3如何安装及卸载服务
        • 2 创建服务
          • 2.1四个方法
            • 2.2 添加安装程序
            • 3 一些技巧
              • 3.1 服务名称配置化
                • 3.2 长任务暂停与继续
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档