本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区。

文章目录

C#/.NET基于Topshelf创建Windows服务的系列文章目录:

  1. C#/.NET基于Topshelf创建Windows服务程序及服务的安装和卸载 (1)
  2. 在C#/.NET应用程序开发中创建一个基于Topshelf的应用程序守护进程(服务) (2)
  3. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案 (3)

前言

对于使用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服务程序及服务的安装和卸载(极速,简洁)的更多相关文章

  1. C#/.NET基于Topshelf创建Windows服务的守护程序作为服务启动的客户端桌面程序不显示UI界面的问题分析和解决方案

    本文首发于:码友网--一个专注.NET/.NET Core开发的编程爱好者社区. 文章目录 C#/.NET基于Topshelf创建Windows服务的系列文章目录: C#/.NET基于Topshelf ...

  2. Windows下mysql服务的安装与卸载

    安装 mysqld -install 也可以指定mysql安装服务的文件 my.ini文件配置好后就可以在cmd中安装mysqld服务了,在cmd中运行命令:mysqld --install MySQ ...

  3. 用Visual C#创建Windows服务程序

    一.Windows服务介绍: Windows服务以前被称作NT服务,是一些运行在Windows NT.Windows 2000和Windows XP等操作系统下用户环境以外的程序.在以前,编写Wind ...

  4. 使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  5. Topshelf创建Windows服务

    使用Topshelf创建Windows服务 概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps ...

  6. 【第三方插件】使用Topshelf创建Windows服务

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  7. 使用Topshelf创建Windows服务[转载]

    概述 Topshelf是创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with Topshelf通过5个步骤详细的 ...

  8. 用C/C++创建windows服务程序

    转载:https://blog.csdn.net/chenyujing1234/article/details/8023816 一.演示过程下方代码演示了如何使用vs(C/C++)创建windows服 ...

  9. Windows环境下使用.bat安装和卸载服务

    一.Windows环境下使用.bat安装和卸载服务 win7环境 例子中“”Valwell.Dms.HttpService.exe“”为服务程序名称 安装服务 %SystemRoot%\Microso ...

随机推荐

  1. 【ASP.NET Core快速入门】(十四)MVC开发:UI、 EF + Identity实现、注册实现、登陆实现

    前言 之前我们进行了MVC的web页面的Cookie-based认证实现,接下来的开发我们要基于之前的MvcCookieAuthSample项目做修改. MvcCookieAuthSample项目地址 ...

  2. 我和Session的不解之“缘”(故事型技术长文)

    本文讲述了一路走来对Session的认知.文章有点长,不过是故事型的,应该不枯燥.相信读完也一定会有所收获. (一) “当你登陆系统后,服务器会创建一个Session,保存你的登陆信息,下次再访问时就 ...

  3. python之字符串反转

    def main(): a = "abcdefg" a = a[::-1] print(a) if __name__ == '__main__': main()

  4. 阿里巴巴(alibaba)系列_druid 数据库连接池_监控(一篇搞定)记录执行慢的sql语句

    参考帖子:http://www.cnblogs.com/han-1034683568/p/6730869.html Druid数据连接池简介 Druid是Java语言中最好的数据库连接池.Druid能 ...

  5. php注册、登录界面的制作

    当初我觉得一个网站上注册和登录这两个功能很神奇,后来自己研究一下发现其实道理很简单,接下来看一下怎么实现的吧.... 我实在我的电脑上建了几个文件: login.html (登录页面) registe ...

  6. php编写生成酷炫验证码

    <?php $im=imagecreate(200,100);//生成画布 imagecolorallocate($im,0,0,0);//背景色 $white=imagecoloralloca ...

  7. Laravel5多图上传和Laravel5单图上传的功能实现

    Laravel5文件上传默认只能上传一张图片,但是有的时候我们需要一次性上传多图就不行了,我在网上看了很多关于laravel5图片上传的文章,很多都只是介绍laravel5单图上传,多图片上传介绍少之 ...

  8. 通过Web API调用Action时各种类型输入参数传递值的方法

    本人微信公众号:微软动态CRM专家罗勇 ,回复280或者20180906可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . Dy ...

  9. jquery获取内容和属性的方法

    通过jquery如何捕获文本内容和属性? text(),html(),val()及attr(). attr()更具有普遍性,元素text属性和表单value属性,可以通过attr()操作. <! ...

  10. ABP大型项目实战(1) - 目录

    前面我写了<如何用ABP框架快速完成项目>系列文章,讲述了如何用ABP快速完成项目.   然后我收到很多反馈,其中一个被经常问到的问题就是,“看了你的课程,发现ABP的优势是快速开发,那么 ...