支持多种操作系统的新一代服务主机

一个应用需要常驻操作系统后台服务,可选框架有WindowsServiceLifeTime和SystemdLifeTime,但需要区别对待不同操作系统且需要另外写命令安装。NewLife.Agent自2008年设计以来,一直秉着简单易用的原则,不仅实现了服务框架,还实现了安装卸载的简易菜单。今天,我们让NewLife.Agent实现IHostLifeTime,成为同时支持Windows和Linux的新一代服务主机!

开源项目:https://github.com/NewLifeX/NewLife.Agent

Nuget:NewLife.Extensions.Hosting.AgentService

快速入门

新建WorkerService服务项目,从Nuget引入 NewLife.Extensions.Hosting.AgentService 。87bb9b5d5afb2eac2c2a0265d1b47d67.png

20b73796dadca9ae68ee48fa2526fbd5.png

入口函数中写入:

using NewLife.Extensions.Hosting.AgentService;
using TestWorker;IHost host = Host.CreateDefaultBuilder(args).ConfigureServices(services =>{services.AddHostedService<Worker>();}).UseAgentService(options =>{options.ServiceName = "TestWorker";options.DisplayName = "Worker服务测试";options.Description = "Worker服务的测试应用";}).Build();await host.RunAsync();

Woker类中写入

using NewLife.Log;namespace TestWorker
{public class Worker : BackgroundService{private readonly ILog _logger;public Worker(ILog logger){_logger = logger;}protected override async Task ExecuteAsync(CancellationToken stoppingToken){while (!stoppingToken.IsCancellationRequested){_logger.Info("Worker running at: {0}", DateTimeOffset.Now);await Task.Delay(1000, stoppingToken);}}public override Task StartAsync(CancellationToken cancellationToken){XTrace.WriteLine(nameof(StartAsync));return base.StartAsync(cancellationToken);}public override Task StopAsync(CancellationToken cancellationToken){XTrace.WriteLine(nameof(StopAsync));return base.StopAsync(cancellationToken);}}
}

双击 TestWorker.exe 跑起来,也可以 dotnet TestWorker.dll 跑起来。

d8b509ad4c469b0b9df02c5c9241d9ec.png

按键 5 进入模拟运行,即是执行Worker等所有 IHostedService,方便开发调试。

cd2613fba2afd61e73bb94778764954c.png

安装服务

引入 NewLife.Extensions.Hosting.AgentService 后,应用本身直接启动时,是一个控制菜单,用于控制服务的安装卸载、启动和停止。控制菜单和服务属于两个进程。

按键 2 可以安装服务

dd98dc48060f2fdb9daa64d3e39c868a.png

这里失败了,因为安装卸载Windows服务需要管理员权限(Linux需要sudo)。在 TestWorker.exe 上点右键,“以管理员身份运行”。

按 3 即可启动服务,也可以在Windows服务中找到服务并启动。在 Linux 中,可以用 systemctl start TestWorker 启动服务。

33ed40f64d80e8a6f1177721dfab9b7c.png

至此,同时支持Windows和Linux的新一代服务主机示例完成。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/282265.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c#中的奇异递归模式

奇异递归模式&#xff0c;Curiously Recurring Template Pattern (CRTP) &#xff0c;作用是能使父类中能够使用子类的信息。下面是我对这个问题的分析过程。 按照一般的继承关系&#xff0c;父类是无法访问到子类的&#xff0c;所以很自然的想到了c#中的泛型&#xff0c;将子类…

面试中get和post的区别

get和post的区别主要有以下几方面&#xff1a;1、url可见性&#xff1a; get&#xff0c;参数url可见&#xff1b; post&#xff0c;url参数不可见2、数据传输上&#xff1a; get&#xff0c;通过拼接url进行传递参数&#xff1b; post&#xff0c;通过body体传输参数3、缓存性…

程序猿与线性代数

逛微博&#xff0c;摸到了一堆宝&#xff1a;关于线性代数学习的文章。先是发现了陈晓鸣&#xff08;http://weibo.com/acumon&#xff09;&#xff0c;前百度资深project师&#xff0c;终身学习者。再找到“文艺复兴记”&#xff08;http://weibo.com/weidagang&#xff09;。…

Verilog MIPS32 CPU(八)-- 控制器

Verilog MIPS32 CPU&#xff08;一&#xff09;-- PC寄存器Verilog MIPS32 CPU&#xff08;二&#xff09;-- RegfilesVerilog MIPS32 CPU&#xff08;三&#xff09;-- ALUVerilog MIPS32 CPU&#xff08;四&#xff09;-- RAMVerilog MIPS32 CPU&#xff08;五&#xff09;--…

[翻译]Dapr 长程测试和混沌测试

介绍这是Dapr的特色项目&#xff0c;具体参见&#xff1a;https://github.com/dapr/test-infra/issues/11 &#xff0c;在全天候运行的应用程序中保持Dapr可靠性至关重要。在部署真正的应用程序之前&#xff0c;可以通过在受控的混沌环境中构建&#xff0c;部署和操作此类应用程…

python UDP-数据报协议

基于udp协议通信的套接字 服务端 1 from socket import *2 3 server socket(AF_INET, SOCK_DGRAM) # SOCK_DGRAM>数据报协议4 server.bind((127.0.0.1, 8080))5 6 print(start....)7 while True:8 data, client_addr server.recvfrom(1024) # (bhello, (127.0.0.1, …

Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0

一、问题描述&#xff1a; 在服务器端可以正常连接并操作mysql&#xff0c;但是在windows端使用navicat工具远程ssh连接就出现下面错误。 1、服务器端&#xff1a; 2、windows端navicat连接 3、原因 原来我今天在做主从配置的时候&#xff0c;将 /etc/my.cnf 配置文件中的b…

自定义ProgressBar(圆)

2019独角兽企业重金招聘Python工程师标准>>> <lib.view.progressbar.ColorArcProgressBarandroid:layout_width"match_parent"android:layout_height"220dip"android:id"id/barInterest"android:layout_centerInParent"true&…

C# Task用法详解

概述Task是微软在.Net 4.0时代推出来的&#xff0c;Task看起来像一个Thread&#xff0c;实际上&#xff0c;它是在ThreadPool的基础上进行的封装&#xff0c;Task的控制和扩展性很强&#xff0c;在线程的延续、阻塞、取消、超时等方面远胜于Thread和ThreadPool&#xff0c;所以…

函数调用堆栈图

转载于:https://www.cnblogs.com/DeeLMind/p/7617972.html

jquery运动

在前面封装的move.js框架&#xff0c;在jquery中有同样封装好的功能animate()。使用方法非常类似&#xff0c;下面我们看看animate的使用方法&#xff0c;有了原生的运动方法&#xff0c;然后再使用jquery的运动方法就会变得非常简单。 animate()语法 $(selector).animate({par…

Session的原理,大型网站中Session方面应注意什么?

一、Session和Cookie的区别 Session是在服务器端保持会话数据的一种方法&#xff08;通常用于pc端网站保持登录状态&#xff0c;手机端通常会使用token方式实现&#xff09;&#xff0c;存储在服务端。 Cookie是在客户端保持用户数据&#xff0c;存储位置是客户端&#xff08…

MySQL5.5读写分离之mysql-proxy

通常一个网站在初期访问量都比较小&#xff0c;所以一般的小架构足以支撑。但是&#xff0c;当网站逐渐发展起来后&#xff0c;随之而来的是大量的访问&#xff0c;这时候最先出现的瓶颈就是数据库了。因为数据的写入读取操作&#xff08;I/O&#xff09;是集群中响应速度最慢的…

两圆相交求面积 hdu5120

转载 两圆相交分如下集中情况&#xff1a;相离、相切、相交、包含。 设两圆圆心分别是O1和O2&#xff0c;半径分别是r1和r2&#xff0c;设d为两圆心距离。又因为两圆有大有小&#xff0c;我们设较小的圆是O1。 相离相切的面积为零&#xff0c;代码如下&#xff1a; [cpp] view …

Python_list部分功能介绍

x.append():在列表尾部添加一个元素 x.clear():把列表清空 x.count():判断某个元素出现的次数 x.extend():合并两个列表&#xff0c;或者一个元组 x.index():获取元素下标 x.insert():指定下标添加元素 x.pop():移除某一元素&#xff0c;移除的元素可获取 x.remove():移除指定的…

一招解决开发环境问题 —— 远程容器开发指南

前言使用C作为主要开发语言的程序猿们应该会认同搭建开发环境是一件烦人的事情。为了编译一个程序不仅需要下载各种依赖包&#xff0c;还可能面临本地系统不兼容、编译器版本不一致、包版本冲突等各种问题。笔者在运营iLogtail开源社区的过程中发现开发和调试环境问题也是成员问…

php中常用的加密方式

一、md5 要说php中的最常用的加密方式&#xff0c;md5可以说是当仁不让。 使用起来也很简单便捷。 注&#xff1a;使用方式请看 六、md5加密方式的漏洞及解决方案 二、password_hash 作为php5.5以上版本专门用于加密的方式&#xff0c;自然有其独到之处。 使用方式链接&a…

解决问题的策略-分而治之

一个宏伟的目标看上去遥不可及&#xff0c;这怎么可能做成呢&#xff1f;但是你把这些目标分解成一个一个的小目标&#xff0c;小目标再往下分解&#xff0c;分解到最后&#xff0c;分解成细枝末节时你会发现&#xff0c;这事其实是可以做的。这个做成了再往下走一步&#xff0…

UITabBarController的基本原理及使用(一)

前言 UITabBarController在iOS开发中是一个高频使用的控制器&#xff0c;典型的案例如QQ、微信均使用UITabBarController布局。本文将从一个新建工程&#xff0c;和大家一起了解UITabBarController的基本原理和使用方法。 基本概念 UITabBarController能够方便地管理多个控制器…

word-vba-microsoft(中英文)

中文 https://msdn.microsoft.com/zh-cn/vba/word-vba/articles/view-displaypageboundaries-property-word 英文 https://msdn.microsoft.com/en-us/vba/word-vba/articles/view-displaypageboundaries-property-word转载于:https://www.cnblogs.com/itzxy/p/7625915.html