首页 > 系统相关 >推荐一款将控制台程序部署到Windows服务的组件

推荐一款将控制台程序部署到Windows服务的组件

时间:2024-07-23 16:32:40浏览次数:10  
标签:服务 Windows 程序 System Topshelf 组件 using 控制台

在日常开发中,有时候需要将我们的程序随着操作系统一起运行,并且无需人工干预。要实现这种效果,有很多种方法,比如:如果是桌面程序,可以设置到程序的启动项;如果是Web程序,还可以托管到IIS中,而对于控制台程序,最常见在做法是将程序部署成Windows服务,并设置成自动运行,这样当操作系统开机时,就会自动启动。在.NET程序中,如何将控制台程序,部署成Windows服务中呢?本文以一个简单的小例,简述如何利用一款第三方插件(Topshelf)将控制台程序部署成Windows服务的相关方法及步骤。

 

什么是Topshelf?

 

Topshelf是一款开源的用于托管.NET编写的应用程序到Windows服务的框架,通过Topshelf,可以非常方便的将普通控制台应用程序,转换成Winodw服务,并注册到Windows服务控制管理器(SCM)中。

 

示例说明

 

Windows服务一般都是周期性重复运行的,并不会停止。在本示例中,主要是为了演示创建Windows服务的方法及功能框架,实现功能是每隔一秒钟,输入一段话到日志文件中,以便于查看。

 

创建控制台应用程序

 

首先创建一个控制台应用程序,以及一个普通的类(AppService),此类包含Start和Stop方法,以及Work方法,具备一个服务的基本功能。如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DemoWinService
{
    /// <summary>
    /// 程序运行主体
    /// </summary>
    internal class AppService
    {
        private CancellationTokenSource cts;
        private CancellationToken token;
        private Task bgtask;

        public AppService()
        {
            this.cts = new CancellationTokenSource();
            this.token = cts.Token;
        }

        /// <summary>
        /// 开始
        /// </summary>
        public void Start()
        {
            Logger.Info("DemoWinService程序开始运行"); 
            this.bgtask = Task.Run(() =>
            {
                while (!this.token.IsCancellationRequested)
                {
                    try
                    {
                        this.Work();
                    }
                    catch (Exception ex)
                    {

                    }
                    finally
                    {
                        Sleep(1000);
                    }
                }

            });
        }

        /// <summary>
        /// 运行
        /// </summary>
        public void Work()
        {
            Logger.Info($"{DateTime.Now.ToString("当前时间为:yyyy-MM-dd HH:mm:ss")}程序正在运行...");
        }

        /// <summary>
        /// 停止
        /// </summary>
        public void Stop()
        {
            cts.Cancel();
            if(this.bgtask != null)
            {
                this.bgtask.Wait(1000);
            }
            Logger.Info("DemoWinService程序结束运行");
        }

        /// <summary>
        /// 线程等待
        /// </summary>
        /// <param name="milliseconds"></param>
        private void Sleep(int milliseconds)
        {
            int times = 10;
            if (milliseconds <= 1000)
            {
                times = 10;
            }
            else if (milliseconds > 1000 && milliseconds <= 10000)
            {
                times = 20;
            }
            else if (milliseconds > 10000 && milliseconds <= 100000)
            {
                times = 40;
            }
            else
            {
                times = 60;
            }
            for (int i = 0; i < times; i++)
            {
                if (token.IsCancellationRequested)
                {
                    return;
                }
                Thread.Sleep(milliseconds / times);
            }
        }
    }
}

 

安装Topshelf组件

 

在Visual Studio开发工具中,可以通过Nuget包管理器进行安装,如下所示:

 

配置注册Windows服务

 

在Program的Main方法中,通过HostFactory的Run方法,注册Windows服务,如下所示:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Topshelf;

namespace DemoWinService
{
    internal class Program
    {
        public static void Main(string[] args)
        {
            var rc = HostFactory.Run(x =>
            {
                x.Service<AppService>(s =>
                {
                    s.ConstructUsing(name => new AppService());
                    s.WhenStarted(tc => tc.Start());
                    s.WhenStopped(tc => tc.Stop());
                });
                x.RunAsLocalSystem();
                x.StartAutomatically();
                x.SetDescription(ConfigurationManager.AppSettings["Description"]);

                x.SetDisplayName(ConfigurationManager.AppSettings["DisplayName"]);
                x.SetServiceName(ConfigurationManager.AppSettings["ServiceName"]);
            });

            var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());

            Environment.ExitCode = exitCode;
        }
    }
}

 其中服务名称和描述信息,在配置文件(App.config)中,方便修改。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
	<appSettings>
		<add key="Description" value="测试Windows服务"/>
		<add key="ServiceName" value="DemoWinService"/>
		<add key="DisplayName" value="DemoWinService"/>
	</appSettings>
</configuration>

 

服务安装

 

当程序开发完成后,将编译后的程序放置在服务器上指定的目录,然后【以管理员运行】打开命令行窗口,找到程序目录,通过以下命令进行安装:

可执行程序.exe install

 示例如下所示:

 

启动停止服务

 

安装成功后,即可在Windows服务管理器中,进行启动或者停止 ,如下所示:

 

 

程序输出日志,表示服务正常运行:

 

 

服务卸载

 

当服务不再使用时,可以通过如下命令卸载服务:

可执行程序.exe uninstall

 

示例如下所示:

 

Topshelf源码

 

Topshelf是一款开源框架,其源码是托管到Github中,如下所示:

GitHub源码:https://github.com/Topshelf/Topshelf

 

以上就是【推荐一款将控制台程序部署到Windows服务的组件】的全部内容,希望可以抛砖引玉,一起学习,共同进步。

标签:服务,Windows,程序,System,Topshelf,组件,using,控制台
From: https://www.cnblogs.com/hsiang/p/18317307

相关文章

  • React中函数组件中闭包陷阱如何产生,如何解决?
    在什么情况下会产生闭包陷阱?在React中,当使用useState和useEffect以及useCallback时,我们必须得注意闭包陷阱,避免出现一些意外的行为什么是闭包陷阱?闭包是指一个函数可以访问其词法作用域之外的变量。闭包主要发生的集中情况?在useState中的闭包陷阱在useEffect中的闭......
  • Windows 中重命名文件有哪几种方法?
    在日常的电脑使用中,重命名文件是一项常见且重要的任务。无论你是要整理文件夹、更新文档标题,还是纠正拼写错误,掌握多种重命名文件的方法都可以提高效率,让你的工作流程更加顺畅。以下是简鹿办公汇总的几种在Windows中重命名文件的有效方式,适合不同场景和偏好。1. 右键菜单法......
  • 探索绝对值码盘接口系列板卡:高精度测量与控制的关键组件
    天津拓航科技绝对值码盘卡在当今高度自动化和精密制造的时代,准确获取位置、角度和速度等信息对于许多工业和科技应用至关重要。绝对值码盘接口系列板卡作为实现这一目标的重要工具,正发挥着日益关键的作用。绝对值码盘接口系列板卡,顾名思义,是专门设计用于与绝对值码盘进行连接和......
  • windows安装postGIS后显示未安装
    1、查询postGIS的安装版本select*frompg_available_extensionsWHEREnamelike'postgis';显示default_version有值但是installed_version没有值。可能是某种原因导致postGIS扩展的元数据信息未正确记录在系统表中。2、删除已安装的postGIS(如果存在)DROPEXTENSIONIF......
  • VMware Tools 12.4.5 下载 - 客户机操作系统无缝交互必备组件
    VMwareTools12.4.5下载-客户机操作系统无缝交互必备组件VMware虚拟机必备组件(驱动和交互式服务)请访问原文链接:https://sysin.org/blog/vmware-tools-12/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwareTools是一套安装在虚拟机的操作系统中的实用程......
  • windows安装scoop教程
    Scoop简介Scoop是Windows的命令行安装程序,是一个强大的包管理工具。可以在github上找到其项目的相关信息,项目网址。安装的起因:在平常生活中如果要安装像gcc、git等一些需要手动配置相关参数的工具,需要先去官网下载安装程序,点击安装,之后还需要配置,不仅过程麻烦,而且工具多了之后整......
  • OpenHarmony开发实战:引导组件规范总结
    介绍基于OpenHarmony的高亮型新手引导组件,通过高亮区域与蒙版背景的明暗度对比,使用户快速锁定重点功能,快速掌握应用基本使用方法。下载安装1.安装ohpminstall@ohos/high_light_guideOpenHarmonyohpm环境配置等更多内容,请参考如何安装OpenHarmonyohpm包 。2.在需......
  • NIO的三大核心组件详解,充分说明为什么NIO在网络IO中拥有高性能!
    一、写在开头我们在上一篇博文中提到了JavaIO中常见得三大模型(BIO,NIO,AIO),其中NIO是我们在日常开发中使用比较多的一种IO模型,我们今天就一起来详细的学习一下。在传统的IO中,多以这种同步阻塞的IO模型为主,程序发起IO请求后,处理线程处于阻塞状态,直到请求的IO数据从内核空间拷贝到用......
  • 使用Ollama部署非官方仓库模型(Windows)
    一、从GitHub拉去llama.cpp项目gitclonehttps://github.com/ggerganov/llama.cpp下载完成后在当前目录的路径输入cmd,进入命令行二、安装python执行的相关依赖执行pipinstall-rrequirements.txt三、下载模型文件依赖安装成功后开始转换模型这里以魔塔上的C......
  • 在Windows安装、部署Tomcat的方法
      本文介绍在Windows操作系统中,下载、配置Tomcat的方法。  Tomcat是一个开源的Servlet容器,由Apache软件基金会的Jakarta项目开发和维护;其提供了执行Servlet和JavaServerPages(JSP)所需的所有功能。其中,Servlet容器的主要职责是执行JavaServlet和JSP——在这里,Servlet......