美文网首页.Net & Core
C#/.NET基于Topshelf创建Windows服务程序及服

C#/.NET基于Topshelf创建Windows服务程序及服

作者: 菜鸟飞不动 | 来源:发表于2019-04-13 00:10 被阅读49次

    前言

    对于使用Windows操作系统的人来说,Windows Service(Windows服务)应该不会陌生。在Windows操作系统中,我们可以在"运行"窗口中运行service.msc

    即可打开一个查看Windows服务的窗口,如图:

    Windows服务基本都是一些后台运行的服务进程,没有UI界面,每个服务处理着各自独立的任务并且有专门的启动或者停止策略。所以,Windows服务在很多情况下会被用来者处理一些定时任务或者调度。

    那么,对于.NET的开发者来说,可不可以自己创建Windows服务呢,如何使用C#创建Windows服务呢?

    本文就为大家分享一种基于Topshelf创建的Windows服务的方法。

    创建Topshelf服务项目

    首先打开Visual Studio(本文使用的是Visual Studio 2019),打开新建项目的对话框,选择.NET Framework的控制台应用程序(Console App(.NET Framework)),如图:

    注:只可选择控制台应用程序

    点击"下一步",在项目名称中输入TopshelfDemoService,.NET Framework 选择4.6.2,其中选项根据自己情况填写即可,最后点击"创建"按钮。

    安装Topshelf组件

    TopshelfDemoService项目中,打开Nuget包管理工具,搜索Topshelf,在搜索结果中选中Topshelf,点击"安装",如图:

    编写Topshelf服务的示例程序代码

    Topshelf组件安装完成后,我们就可以开始编写服务的示例代码了。

    首先,创建一个名为HealthMonitorService.cs的类(其作用假设为定时监控某个系统的运行健康状况),在其中分别创建方法:Start()Stop()以及一个定时器,让定时器定时执行检查系统健康状况的任务(这里模拟的每秒向控制台输出一条文本信息),完整的代码如下:

    using System;
    using System.Timers;
    
    namespace TopshelfDemoService
    {
        internal class HealthMonitorService
        {
            private readonly Timer _timer;
            public HealthMonitorService()
            {
                _timer = new Timer(1000) { AutoReset = true };
                _timer.Elapsed += (sender, eventArgs) => Console.WriteLine("执行系统健康检查任务,所有指标均正常。执行时间:{0}", DateTime.Now);
            }
    
            public void Start()
            {
                _timer.Start();
            }
            public void Stop()
            {
                _timer.Stop();
            }
        }
    }
    

    再创建一个名为MyServiceConfigure.cs的服务配置类,这个类主要用来配置Topshelf服务的各种运行参数,代码如下:

    using System;
    using Topshelf;
    
    namespace TopshelfDemoService
    {
        internal class MyServiceConfigure
        {
            internal static void Configure()
            {
                var rc = HostFactory.Run(host =>                                    // 1
                {
                    host.Service<HealthMonitorService>(service =>                   // 2
                    {
                        service.ConstructUsing(() => new HealthMonitorService());   // 3
                        service.WhenStarted(s => s.Start());                        // 4
                        service.WhenStopped(s => s.Stop());                         // 5
                    });
    
                    host.RunAsLocalSystem();                                        // 6
    
                    host.EnableServiceRecovery(service =>                           // 7
                    {
                        service.RestartService(3);                                  // 8
                    });
                    host.SetDescription("Windows service based on topshelf");       // 9
                    host.SetDisplayName("Topshelf demo service");                   // 10
                    host.SetServiceName("TopshelfDemoService");                     // 11
                    host.StartAutomaticallyDelayed();                               // 12
                });
    
                var exitCode = (int)Convert.ChangeType(rc, rc.GetTypeCode());       // 13
                Environment.ExitCode = exitCode;
            }
        }
    }
    

    注:其中数字的含义请见本文末尾的解释。

    最后,打开Program.cs文件,开启Topshelf服务,如下:

    namespace TopshelfDemoService
    {
        class Program
        {
            static void Main(string[] args)
            {
                MyServiceConfigure.Configure();
            }
        }
    }
    

    好了,完成到这里,整个示例程序就写好了,按F5运行示例程序,你将看到如下类似的控制台信息:

    可以看到,我们创建的TopshelfDemoService服务每秒向控制台打印了一条文本信息,这和我们的预期是吻合的。

    这样,我们就成功创建了一个基于Topshelf的Windows服务,当然,这也只是一个简单和示例服务程序,其中没有复杂的业务逻辑和配置等等。这些都等待你去发掘。

    作为Windows服务安装和卸载

    我们刚才运行的只是一个控制台应用程序,如果将这个控制台应用程序关掉,定时任务也会被停止了。如果我们希望定时任务可以一直运行,那需要将这个控制台应用程序作为服务安装到Windows服务进程中,如何操作呢?

    非常简单的安装和卸载命令。

    首先,以管理员身份打开一个命令行工具,进入到控制台应用程序所在目录。

    安装

    安装服务运行如下命令:

    TopshelfDemoService.exe install
    

    打开Windows服务查看窗口(刷新),可以看到Topshelf demo service已经在服务列表中了,如图:

    这时,我们只需要按照Windows服务来操作这个服务即可。

    卸载

    如果需要卸载服务,则运行如下命令:

    TopshelfDemoService.exe uninstall
    

    Topshelf配置参数说明

    1.设置服务主机使用HostFactory.Run()来创建并运行一个Topshelft服务。
    2.设置Topshelf使用类型HealthMonitorService作为服务类。
    3.配置如何创建一个服务的实例,这里采用的是使用关键字new来实例化一个HealthMonitorService对象,你也可以使用IoCp容器来实例化服务对象。
    4.设置当服务启动时执行的操作。
    5.设置当服务停止时执行的操作。
    6.设置将服务以本地系统身份运行。
    7.启动恢复服务模式(当服务意外停止后自动恢复)。
    8.设置第一次自动恢复服务的延迟时间为3分钟。
    9.设置Topshelf服务在Windows服务中的描述信息。
    10.设置Topshelf服务在Windows服务中的显示名称。
    11.设置Topshelf服务在Windows服务中的服务名称。
    12.设置Topshelf服务随Windows启动时自动运行(延迟)。
    13.设置服务的退出代码。

    示例代码托管和下载

    本示例代码托管地址可以在原出处找到:示例代码下载地址

    相关文章

      网友评论

        本文标题:C#/.NET基于Topshelf创建Windows服务程序及服

        本文链接:https://www.haomeiwen.com/subject/qaskwqtx.html