Windows创建服务(.NET8)

windows服务

Windows服务是一种在Windows操作系统中运行的后台程序,用于在系统启动时启动并在系统关闭时关闭。这些服务可以是Microsoft自己的服务,也可以是第三方软件的服务。它们在后台运行,通常不需要交互式用户界面。 Windows服务通常用于在计算机上提供系统级别的功能和服务,例如打印服务、数据库服务、网络服务、系统安全服务等。 通常,Windows服务可以在服务控制管理器(SCM)中进行配置和管理。其中,SCM是一种Windows组件,用于管理Windows服务和设备驱动程序。

.NET8

在全盘扫描是怎么实现的介绍了下.NET5的架构。目前.NET已经升级到.NET8。Blazor maui AOT更加成熟。微软在不遗余力的布局全平台,提升C#的性能.。ChatGPT最大的BOSS也是微软,只能说微软是真的强,虽错过了移动互联网,但凭借云计算和人工智能的布局,我想会再一次登顶科技圈。不得不说,科技是第一生产力。 .NET8新增功能在这里。
在这里插入图片描述

创建windows服务

本文以打卡程序为例来实践下整个服务的创建过程。

  1. dotnet new worker --name “SmartSign2”
  2. dotnet add package Microsoft.Extensions.Hosting.WindowsServices
  3. 更新项目文件
  <PropertyGroup><TargetFramework>net8.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings><RootNamespace>App.WindowsService</RootNamespace><OutputType>exe</OutputType><PublishSingleFile Condition="'$(Configuration)' == 'Release'">true</PublishSingleFile><RuntimeIdentifier>win-x64</RuntimeIdentifier><PlatformTarget>x64</PlatformTarget><UserSecretsId>dotnet-smart_sign-ef6ac77d-c996-482b-8f81-5d63d0c287a5</UserSecretsId></PropertyGroup>
  1. 创建服务
    要爬去网站或者模拟登陆的话,请修改相应的账号密码以及URL
public sealed class JokeService
{private string name = "xxx";private string password = "xxx";public string GetKqMessage(){String Result = String.Empty;IWebDriver wd = null;try{wd = new EdgeDriver();wd.Navigate().GoToUrl("http://xxx/#/");IWindow window = wd.Manage().Window;Thread.Sleep(2000);//处理登陆wd.FindElement(By.Name("account")).SendKeys(name);wd.FindElement(By.Name("password")).SendKeys(password);wd.FindElement(By.CssSelector("body > div > div > div > form > button > span")).Click();Thread.Sleep(10000);//打卡记录var record = "body > div.theme_panasonic > div > section > section > div > main > div.el-col.el-col-4.el-col-offset-2 > div > div:nth-child(4) > div:nth-child(5) > div > div > div:nth-child(2) > span";wd.FindElement(By.CssSelector(record)).Click();Thread.Sleep(5000);//每日考勤var attendence = "body > div > div > section > section > div > main > div.el-col.el-col-24 > div:nth-child(1) > div.EasyNormalTable > div.el-card.box-card.is-always-shadow > div.el-card__header > div > div > button:nth-child(3) > span";wd.FindElement(By.CssSelector(attendence)).Click();Thread.Sleep(2000);var attendence_time = "body > div > div > section > section > div > main > div.el-col.el-col-24 > div:nth-child(1) > div > div.el-card.box-card.is-always-shadow > div.el-card__body > div.filter-container > span.el-tag.el-tag--success.el-tag--light";var total_time = wd.FindElement(By.CssSelector(attendence_time)).Text;var tbody = wd.FindElement(By.TagName("tbody"));var detail_message = tbody.Text;var childrens = tbody.FindElements(By.TagName("tr"));// 第一条打卡记录var first_record_message = childrens.First().Text;String last_record_message = String.Empty;if (childrens.Count >= 2){last_record_message = childrens[childrens.Count - 2].Text;}else{last_record_message = childrens[childrens.Count - 1].Text;}var record_message = first_record_message + "," + last_record_message;Thread.Sleep(2000);wd.Navigate().GoToUrl("http://burning.live:3000/counter");Thread.Sleep(3000);wd.FindElement(By.CssSelector("body > div.page > main > article > div > textarea")).SendKeys("首末次打卡情况:" + record_message + " \r\n" + total_time + "\r\n" + detail_message);var btn_send = wd.FindElement(By.CssSelector("#mail"));btn_send.Click();Thread.Sleep(3000);Result = record_message;}catch (Exception e){Console.WriteLine(e);Result = e.StackTrace;}finally{if (wd != null){wd.Close();wd.Quit();}}return Result;}public string GetJoke(){Joke joke = _jokes.ElementAt(Random.Shared.Next(_jokes.Count));return $"{joke.Setup}{Environment.NewLine}{joke.Punchline}";}// Programming jokes borrowed from:// https://github.com/eklavyadev/karljoke/blob/main/source/jokes.jsonprivate readonly HashSet<Joke> _jokes = new(){new Joke("What's the best thing about a Boolean?", "Even if you're wrong, you're only off by a bit."),new Joke("What's the object-oriented way to become wealthy?", "Inheritance"),new Joke("Why did the programmer quit their job?", "Because they didn't get arrays."),new Joke("Why do programmers always mix up Halloween and Christmas?", "Because Oct 31 == Dec 25"),new Joke("How many programmers does it take to change a lightbulb?", "None that's a hardware problem"),new Joke("If you put a million monkeys at a million keyboards, one of them will eventually write a Java program", "the rest of them will write Perl"),new Joke("['hip', 'hip']", "(hip hip array)"),new Joke("To understand what recursion is...", "You must first understand what recursion is"),new Joke("There are 10 types of people in this world...", "Those who understand binary and those who don't"),new Joke("Which song would an exception sing?", "Can't catch me - Avicii"),new Joke("Why do Java programmers wear glasses?", "Because they don't C#"),new Joke("How do you check if a webpage is HTML5?", "Try it out on Internet Explorer"),new Joke("A user interface is like a joke.", "If you have to explain it then it is not that good."),new Joke("I was gonna tell you a joke about UDP...", "...but you might not get it."),new Joke("The punchline often arrives before the set-up.", "Do you know the problem with UDP jokes?"),new Joke("Why do C# and Java developers keep breaking their keyboards?", "Because they use a strongly typed language."),new Joke("Knock-knock.", "A race condition. Who is there?"),new Joke("What's the best part about TCP jokes?", "I get to keep telling them until you get them."),new Joke("A programmer puts two glasses on their bedside table before going to sleep.", "A full one, in case they gets thirsty, and an empty one, in case they don’t."),new Joke("There are 10 kinds of people in this world.", "Those who understand binary, those who don't, and those who weren't expecting a base 3 joke."),new Joke("What did the router say to the doctor?", "It hurts when IP."),new Joke("An IPv6 packet is walking out of the house.", "He goes nowhere."),new Joke("3 SQL statements walk into a NoSQL bar. Soon, they walk out", "They couldn't find a table.")};
}readonly record struct Joke(string Setup, string Punchline);
  1. 重写worker类
    可通过事件查看器来查看日志。在指定的时间会调用GetKqMessage,其他时间调用GetJoke
namespace App.WindowsService;public sealed class WindowsBackgroundService : BackgroundService
{private readonly JokeService _jokeService;private readonly ILogger<WindowsBackgroundService> _logger;private int interval = 0;public WindowsBackgroundService(JokeService jokeService,ILogger<WindowsBackgroundService> logger) =>(_jokeService, _logger) = (jokeService, logger);protected override async Task ExecuteAsync(CancellationToken stoppingToken){try{while (!stoppingToken.IsCancellationRequested){var isNeedTime = (DateTimeOffset.Now.Hour == 20 && DateTimeOffset.Now.Minute == 00) || (DateTimeOffset.Now.Hour == 18 && DateTimeOffset.Now.Minute == 00)|| (DateTimeOffset.Now.Hour == 15 && DateTimeOffset.Now.Minute == 00) || (DateTimeOffset.Now.Hour == 10 && DateTimeOffset.Now.Minute == 00);if (isNeedTime) {string kqMessage = _jokeService.GetKqMessage();_logger.LogWarning("打卡结束 {kqMessage}", kqMessage);}else{if (interval % 4 == 0){string joke = _jokeService.GetJoke();_logger.LogWarning("interval is  {interval}, {Joke}, 当前时间是: {time}", interval, joke, DateTimeOffset.Now);}}await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken);interval++;if (interval == 30){Console.Clear();interval = 0;}}}catch (OperationCanceledException){interval = 0;// When the stopping token is canceled, for example, a call made from services.msc,// we shouldn't exit with a non-zero exit code. In other words, this is expected...}catch (Exception ex){interval = 0;_logger.LogError(ex, "{Message}", ex.Message);// Terminates this process and returns an exit code to the operating system.// This is required to avoid the 'BackgroundServiceExceptionBehavior', which// performs one of two scenarios:// 1. When set to "Ignore": will do nothing at all, errors cause zombie services.// 2. When set to "StopHost": will cleanly stop the host, and log errors.//// In order for the Windows Service Management system to leverage configured// recovery options, we need to terminate the process with a non-zero exit code.Environment.Exit(1);}}
}
  1. 重写Program.cs
using App.WindowsService;
using Microsoft.Extensions.Logging.Configuration;
using Microsoft.Extensions.Logging.EventLog;HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddWindowsService(options =>
{options.ServiceName = "SmartSign2";
});LoggerProviderOptions.RegisterProviderOptions<EventLogSettings, EventLogLoggerProvider>(builder.Services);builder.Services.AddSingleton<JokeService>();
builder.Services.AddHostedService<WindowsBackgroundService>();IHost host = builder.Build();
host.Run();
  1. 发布应用
    在这里插入图片描述
  2. 创建 Windows 服务
    sc.exe create “SmartSign2” binpath=“C:\Users\yy\source\Python_Kq (1)\smart\smart_sign\bin\Release\net8.0\win-x64\publish\smart_sign.exe”
  3. 配置 Windows 服务
    sc qfailure “SmartSign2”
  4. 启动 Windows 服务
    sc.exe start “SmartSign2”
  5. 停止 Windows 服务
    sc.exe stop “SmartSign2”
  6. 删除 Windows 服务
    sc.exe delete “SmartSign2”

参考

使用 BackgroundService 创建 Windows 服务

更多内容,欢迎关注我的微信公众号:半夏之夜的无情剑客。

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

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

相关文章

Windows(Microsoft)win电脑装Xcode方法

你想在你的Windows电脑上体验和使用苹果的Xcode进行应用打包。遗憾的是&#xff0c;Xcode官方只支持macOS操作系统&#xff0c;但别担心&#xff0c;我们有替代方案可以让你在Windows环境下进行iOS应用的开发和打包。接下来我将指导你如何实现这一目标。 图片来源&#xff1a;W…

Linux中的网络配置

本章主要介绍网络配置的方法 网络基础知识查看网络信息图形化界面修改通过配置文件修改 1.1 网络基础知识 一台主机需要配置必要的网络信息&#xff0c;才可以连接到互联网。需要的配置网络信息包括IP、 子网掩码、网关和 DNS 1.1.1 IP地址 在计算机中对IP的标记使用的是3…

协议栈的内部结构

上层会向下层逐层委派工作。 最上面的部分是网络应用程序&#xff0c;它们会将收发数据等工作委派给下层的部分来完成。尽管不同的应用程序收发的数据内容不同&#xff0c;但收发数据的操作是共通的。 应用程序的下面是Socket库&#xff0c;其中包括解析器&#xff0c;解析器…

Java画爱心

Java画爱心代码&#xff0c;每个人都可以被需要 效果图 源代码 package com.example.test; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Image; import java.awt.Toolkit; import javax.swing.JFrame; class Cardioid extend…

使用cross-env兼容windows和linux环境的nodejs变量

文章目录 前言一、windows使用二、linux环境三、区别相同点不同点 四、使用cross-env兼容项目安装cross-env使用 总结如有启发&#xff0c;可点赞收藏哟~ 前言 由于办公和家里的开发环境不同&#xff08;windows和linux&#xff09; 在处理nodejs项目的时候&#xff0c;脚本设…

关注!6岁娃眼外伤后头晕、呕吐,竟是这里骨折了……

孩子们天性活泼好动&#xff0c;总是爱跑爱跳打打闹闹&#xff0c;加上他们机体协调控制能力差&#xff0c;磕磕碰碰情况时有发生&#xff0c;可能导致外伤发生。 前不久&#xff0c;6岁的萱萱(化名)在学校上体育课时&#xff0c;不慎与同学相撞&#xff0c;导致右眼被撞伤。老…

Linux 正则表达式

内容概述 1 文本编辑工具之神 VIM 1.1 vi 和 vim 简介 在 Linux 中我们经常编辑修改文本文件&#xff0c;即由 ASCII Unicode 或者其他编码的纯文字的文件。之前介绍过的 nano&#xff0c;实际工具中我们使用更为专业&#xff0c;功能强大的工具 文本编辑种类&#xff1a; vi…

神经网络模型流程与卷积神经网络实现

神经网络模型流程 神经网络模型的搭建流程&#xff0c;整理下自己的思路&#xff0c;这个过程不会细分出来&#xff0c;而是主流程。 在这里我主要是把整个流程分为两个主流程&#xff0c;即预训练与推理。预训练过程主要是生成超参数文件与搭设神经网络结构&#xff1b;而推理…

基于OpenCV+CNN+IOT+微信小程序智能果实采摘指导系统——深度学习算法应用(含pytho、JS工程源码)+数据集+模型(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境Jupyter Notebook环境Pycharm 环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于Keras框架&#xff0c;引入CNN进行模型训练&#xff0c;采用Dropout梯度下降算法&#xff0c;按比例…

【Vue】vue整合element

上一篇&#xff1a; vue项目的创建 https://blog.csdn.net/m0_67930426/article/details/134816155 目录 整合过程 使用&#xff1a; 整合过程 项目创建完之后&#xff0c;使用编译器打开项目 在控制器里输入如下命令 npm install element-ui 如图表示安装完毕 然后在…

报错解决:Fatal error: ‘THC/THC.h‘: No such file or directory

报错解决&#xff1a;Fatal error: THC/THC.h: No such file or directory 报错原因解决方法总结参考文献 报错 博主的软硬件环境&#xff08;供参考&#xff09;&#xff1a; LinuxNVIDIA GeForce RTX 3090CUDA 11.6gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0Pytorch&#…

YOLOv8创新魔改教程(三)如何添加注意力机制注意力机制的用法与思考

注意力机制的用法与思考 好多同学问我加了CA注意力机制&#xff0c;CBAM注意力机制&#xff0c;都没有涨点&#xff0c;然后就在不停地换不同的注意力机制&#xff0c;其实并不是这样的。今天和大家讨论一下注意力机制的用法与思考。 &#xff08;一&#xff09;添加位置 大…

东芝CT高压电源维修VP-33452 ULTIMAX80 DREX-ULT80

东芝高压电源多用于东芝CT机XVISION/EX、AUKLET系列、ASTEION系列、以及多排系列。 电源内部电路不得随意更改。电源维修的几点注意事项&#xff0c;希望大家能够在以后遇到类似的问题能帮帮助到大家。spellmαnl电源维修一首先在维修开关电源时&#xff0c;维修人员在修理时注…

计算机视觉GPT时刻!UC伯克利三巨头祭出首个纯CV大模型,推理惊现AGI火花

计算机视觉的GPT时刻&#xff0c;来了&#xff01; 最近&#xff0c;来自UC伯克利的计算机视觉「三巨头」联手推出了第一个无自然语言的纯视觉大模型&#xff08;Large Vision Models&#xff09;&#xff0c;并且第一次证明了纯视觉模型本身也是可扩展的&#xff08;scalabil…

JVM 分析GC日志

GC日志参数 -verbose:gc 输出gc日志信息&#xff0c;默认输出到标准输出 -XX:PrintGC 输出GC日志。类似&#xff1a;-verbose:gc -XX:PrintGCDetails 在发生垃圾回收时打印内存回收详细的日志&#xff0c;并在进程退出时输出当前内存各区域分配情况 -XX:PrintGCTimeStam…

天池SQL训练营(四)-集合运算-表的加减法和join等

-天池龙珠计划SQL训练营 4.1表的加减法 4.1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 U…

YOLOv3 学习笔记

文章目录 前言一、YOLOv3贡献和改进二、YOLOv3的核心概念2.1 基础理论和工作原理2.2 YOLOv3对比YOLOv1和YOLOv22.2.1 YOLOv12.2.2 YOLOv2/YOLO90002.2.3 YOLOv3 三、YOLOv3的网络架构3.1 Darknet-533.2 残差连接3.3 多尺度预测3.4 锚框3.5 类别预测和对象检测3.6 上采样和特征融…

halcon如何设置窗口背景颜色?

halcon窗口背景默认是黑色&#xff0c;有时候图片背景是黑色&#xff0c;不方便观察边缘&#xff0c;如果需要设置窗口背景颜色&#xff0c;可以使用如下算子。 设置窗口背景颜色&#xff1a;白色 set_window_param (WindowHandle, background_color, white) 设置白色后的效…

Linux 基础知识整理(三)

Linux文件和目录 Linux系统是一种典型的多用户系统&#xff0c;不同的用户有不一样的地位和权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。 root权限最高&#xff0c;可以通过ls -l 或…

网络安全赚不了大钱却值得入行?真相只有一个!

想要知道网络安全行业收入的现状&#xff0c;首先要对网络安全行业有一个大概的了解。网络安全行业并不是一个笼统的概念&#xff0c;业内人士都知道&#xff0c;“网络安全行业”和“网络安全岗位”是两个概念。 网络安全行业是倾向于做网络安全相关产品、解决方案、服务的企业…