C# 中用 TopShelf服务创建和延迟运行

TopShelf 是一个开源项目,它简化了在 .NET 环境中创建和管理 Windows 服务的流程。以下是一个简单的示例,展示了如何使用 TopShelf 创建一个服务,并在服务启动后延迟执行某些操作。

首先,确保你已经安装了 TopShelf。你可以通过 NuGet 包管理器来安装它:

Install-Package Topshelf

然后,你可以创建一个服务类,如下所示:

using System;
using System.Threading;
using System.Threading.Tasks;
using Topshelf;public class MyService
{private Timer _timer;private bool _isRunning;public bool Start(HostControl hostControl){_isRunning = true;// 假设我们希望在服务启动后延迟 10 秒再执行某些操作Task.Delay(10000).Wait(); // 等待 10 秒StartMyServiceOperations(); // 开始你的服务操作return true;}private void StartMyServiceOperations(){// 初始化并启动一个定时器来模拟服务的工作_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1)); // 每分钟执行一次}private void DoWork(object state){Console.WriteLine("Service is performing work...");}public bool Stop(HostControl hostControl){_isRunning = false;_timer?.Change(Timeout.Infinite, Timeout.Infinite);_timer?.Dispose();return true;}
}

接下来,你需要配置 Topshelf 服务,并安装它:

class Program
{static void Main(string[] args){var exitCode = HostFactory.Run(x =>{x.Service<MyService>(s =>{s.ConstructUsing(name => new MyService());s.WhenStarted(tc => tc.Start(null));s.WhenStopped(tc => tc.Stop(null));});x.RunAsLocalSystem(); // 以本地系统身份运行服务x.SetDescription("My Topshelf Service"); // 设置服务描述x.SetDisplayName("MyTopshelfService"); // 设置服务显示名称x.SetServiceName("MyTopshelfService"); // 设置服务名称});int exitCodeValue = (int)Convert.ChangeType(exitCode, exitCode.GetTypeCode());Environment.ExitCode = exitCodeValue;}
}

在上面的代码中,MyService 类包含了服务的核心逻辑。Start 方法在服务启动时调用,并使用了 Task.Delay 来模拟延迟启动的行为。一旦延迟时间过去,就会调用 StartMyServiceOperations 方法来开始服务的实际工作。在这个例子中,我创建了一个简单的定时器来模拟服务的持续运行。

Program 类的 Main 方法配置了 Topshelf 服务并运行它。你可以通过 Topshelf 提供的命令行工具来安装、卸载和启动服务。例如,要安装服务,你可以在命令行中运行:

MyService.exe install

要启动服务,你可以使用 Windows 的服务管理工具,或者使用命令行:

net start MyTopshelfService

请注意,运行服务需要管理员权限。此外,根据你的具体需求,你可能需要调整服务的逻辑和配置。

如果想把服务设置成延迟启动,可以应用一下配置

如果你想使用 Topshelf 来配置一个延迟自动启动类型的服务,可以通过设置 StartAutomaticallyDelayed 方法来实现。这样可以让服务在系统启动后延迟一段时间后自动启动。下面是修正后的代码示例:

using System;
using System.Threading;
using Topshelf;public class MyService
{private Timer _timer;private bool _isRunning;public bool Start(HostControl hostControl){_isRunning = true;StartMyServiceOperations(); // 开始你的服务操作return true;}private void StartMyServiceOperations(){// 初始化并启动一个定时器来模拟服务的工作_timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromMinutes(1)); // 每分钟执行一次}private void DoWork(object state){Console.WriteLine("Service is performing work...");}public bool Stop(HostControl hostControl){_isRunning = false;_timer?.Change(Timeout.Infinite, Timeout.Infinite);_timer?.Dispose();return true;}
}class Program
{static void Main(string[] args){HostFactory.Run(x =>{x.Service<MyService>(s =>{s.ConstructUsing(name => new MyService());s.WhenStarted(tc => tc.Start(null));s.WhenStopped(tc => tc.Stop(null));});x.RunAsLocalSystem(); // 以本地系统身份运行服务x.StartAutomaticallyDelayed(); // 设置延迟自动启动x.SetDescription("My Topshelf Service"); // 设置服务描述x.SetDisplayName("MyTopshelfService"); // 设置服务显示名称x.SetServiceName("MyTopshelfService"); // 设置服务名称});}
}

在这个修正后的代码中,关键的更改是在 HostFactory.Run 方法中使用了 StartAutomaticallyDelayed 方法来配置服务延迟自动启动。这样一来,当系统启动后,服务会在一段时间后自动启动,而不是立即启动。

你可以通过这种方式来配置 Topshelf 服务,使其符合你的需求。记得根据具体情况调整服务的逻辑和配置。

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

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

相关文章

C++树形结构(总)

目录 一.基础&#xff1a; 1.概念&#xff1a; 2.定义&#xff1a; Ⅰ.树的相关基础术语&#xff1a; Ⅱ.树的层次&#xff1a; 3.树的性质&#xff1a; 二.存储思路&#xff1a; 1.结构体存储&#xff1a; 2.数组存储&#xff1a; 三.树的遍历模板&#xff1a; 四.…

学习笔记-系统框图简化求传递函数公式例题

简化系统结构图求系统传递函数例题 基础知识回顾 第四讲 控制系统的方框图 (zhihu.com) 「自控原理」2.3 方框图的绘制及化简_方框图化简-CSDN博客 自动控制原理笔记-结构图及其等效变换_结构图等效变换-CSDN博客 例子一 「自控原理」2.3 方框图的绘制及化简_方框图化简-CS…

7-20FPGA调试日志

1. 在代码里面定义的ILA的变量名称与波形抓取界面的不一致 问题描述 ::: 2. 直接从其他的播放声音的平台放音乐没问题&#xff0c;但是从AU里面生成的2kHz的正弦波放不出声音 演示视频链接 好像和ILA的例化信号有关&#xff0c;例化ILA信号的驱动时钟信号频率没有内部的其他…

MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错?

MySQL字段设置的varchar长度小于数据长度自动截取丢弃超出的长度而不是报错&#xff1f; 事情是这样的&#xff0c;我们一个订单表存放了商品的快照信息其中快照信息存储的是json格式商品信息&#xff0c;当查看订单是报错了&#xff0c;发现我们后端服务查询到订单的快照信息…

dockerfile部署wordpress

1.将容器直接提交成镜像 [rootlocalhost ~]# docker commit 8ecc7f6b9c12 nginx:1.1 sha256:9a2bb94ba6d8d952527df616febf3fbc8f842b3b9e28b7011b50c743cd7b233b [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED SIZE nginx …

C语言 数据存储之结构类型 万字讲解#数据类型详细介绍 #整型在内存中的存储 #大小端字节序 #浮点型在内存的存储解析

文章目录 目录 前言 一、数据类型详细介绍 类型的意义&#xff1a; 1、类型的基本归类 a.整型家族 b.浮点型家族 c.构造类型 数组类型 结构体类型 struct 枚举类型 enum 联合类型 union d.指针类型 e.空类型 二、整型在内存中的存储 三、大小端字节序 什么是…

MySql性能调优05-[sql实战演练]

sql实战演练 行列转换行列式转换第一题【列转行】第二题【列转行】 having的使用找到表中&#xff0c;名字重复的项有数据表employee&#xff0c;包含如下字段id、name、department、age&#xff0c;编写SQL&#xff0c;找到不与其他人同龄的年纪最大的员工的年龄有数据表emplo…

使用LibTorch加载预训练PyTorch模型实践

PyTorch如今发布到1.1稳定版本&#xff0c;新增的功能让模型部署变得更为地简单&#xff0c;本文记录如何利用C来调用PyTorch训练好的模型&#xff0c;其实也是利用官方强大的LibTorch库。 LibTorch的安装 虽然说安装&#xff0c;其实就是下载官方的LibTorch包而已&#xff0…

ModelArts中sinh算子的开发

一、环境配置 1、创建notebook并连接 使用ModelArts新建一个notebook,我这里镜像选择第一个,里面含有cann和Ascend910处理器,我这里环境只能使用ssh连接,创建一个密钥对,保存到C盘中的user/Administrator/目录下。 在网页中选择使用vscode接入,等待vscode打开后,选择密…

对链表的头结点和各个指向结点的引用的理解。力扣24题,两两交换链表中的结点。

头结点 其实是知道在链表前面添加一个没有实际存储内容的头结点是有利于程序运行的&#xff0c;但是在实际编程中总是会忘记或者不知道到底起到什么样的作用&#xff0c;或许这就是纸上得来终觉浅&#xff0c;绝知此事要躬行吧。 力扣24题要求我们两两交换链表中的结点。题目…

PotatoTool 蓝队版 V1.3 发布:增强功能和性能优化

一、简介 经过广大网友的反馈和建议&#xff0c;我们对V1.1版本中存在的问题进行了优化。其中&#xff0c;我们针对MD5库进行了本地化处理&#xff0c;以提高查询效率。然而&#xff0c;这也导致了软件体积的飙升。二、优化概述 1、兼容性 兼容arm架构系统 2、UI 2.1 界面…

Linux磁盘扩容lvm

目录 Linux磁盘管理基础知识介绍 1.确认分区类型 2.添加新硬盘 3.给新硬盘添加分区 &#xff08;2&#xff09;指定分区类型 4.创建物理卷 5.创建卷组 6.扩展逻辑卷 7.刷新文件系统 &#xff08;1&#xff09;查看文件系统 xfs文件系统使用&#xff08;centos&#…

【YOLOv8系列】图像分类篇----通过YOLOv8实现图像分类功能

最近需要使用YOLOv8对自己的数据集进行训练,从而实现图像分类的功能,因此记录一下整个过程。 YOLOv8的github地址:https://github.com/ultralytics/ultralytics 参考链接:超详细YOLOv8图像分类全程概述:环境、训练、验证与预测详解 文章目录 一、YOLOv8环境搭建二、准备…

80. 删除有序数组中的重复项 II【 力扣(LeetCode) 】

一、题目描述 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成…

docker部署mysql8.x版本,shell脚本字段部署安装mysql

docker部署mysql8.x版本&#xff0c;shell脚本字段部署安装mysql **1.**先自行安装好docker环境&#xff0c;docker的镜像注册中心最好是国内的&#xff0c;例如执行一下命令直接修改docker配置&#xff0c; cat <<EOF > /etc/docker/daemon.json {"registry-m…

深入理解算数表达式求值:后缀表达式的转换与计算

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd;没人会嘲笑竭尽全力的人&#xff01; 前…

python实现定时任务功能的两种方案

第一种方式&#xff0c;使用python自带的threading库&#xff0c;使用递归调用实现定时任务 import threading import time def job():print("定时任务执行")# 设置定时任务的间隔时间&#xff0c;单位为秒interval 5# 使用递归调用实现定时任务的循环执行threadin…

PT2262-IR

PT2262是一款很古老的编码芯片&#xff0c;其兼容型号有&#xff1a;SC2262&#xff0c;AD2262&#xff0c;SC2260(需改变匹配电阻)等。 依据其datasheet&#xff0c;PT2262射频模式工作原理: CODE BITS A Code Bit is the basic component of the encoded waveform, and ca…

34_YOLOv5网络详解

1.1 简介 YOLOV5是YOLO&#xff08;You Only Look Once&#xff09;系列目标检测模型的一个重要版本&#xff0c;由 Ultralytics 公司的Glenn Jocher开发并维护。YOLO系列以其快速、准确的目标检测能力而闻名&#xff0c;尤其适合实时应用。YOLOV5在保持高效的同时&#xff0c…

13、.Net相关的书籍 - .Net循序渐进系列文章

这篇博文介绍.Net相关的书籍。 1、 ASP.NET。 ASP.NET作为微软.NET体系里的重要组成部分&#xff0c;得到了微软合作伙伴以及众多的微软编程爱好者的欢迎。ASP.NET在经历了好几个版本的更新之后&#xff0c;其内容也越来越充实了。目前ASP.NET的版本是4.0版&#xff0c;其中…