Web开发:使用C#创建、安装、调试和卸载服务以及要注意的写法

news2024/9/21 21:06:48

目录

一、创建服务

1.创建项目(.NET Framework)

 2.重命名

3.编写逻辑代码

 二、安装服务

1.方案一:利用VS2022安装文件的配置

选择添加安装程序

安装文件的介绍及配置

​编辑​ 重新编译

工具安装

2.方案二:编写bat脚本安装服务

 重新编译

创建bat

运行bat 

三、调试服务

1.服务运行的原理

2.调试

(1)建议:定时器间隔小一点,好调试

(2)步骤:

(3)更好的调试方法:

四、卸载服务

方案一:VS2022配置卸载方法

 方案二:bat脚本卸载方法:一停二删


一、创建服务

需求:每隔20秒写一次日志

1.创建项目(.NET Framework)

上面这个是最新的.NET(Core)的服务,我演示的是下面这个Windows服务

如果你没有这个模板,确保你安装了以下的工具:

 2.重命名

改名为MyService,这个只是一个类名,不是最后的服务名,不改也可以:

​ 我还是习惯改一下:

3.编写逻辑代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Threading;
using System.Threading.Tasks;


namespace WindowsService1
{
    public partial class MyService : ServiceBase
    {
        private Timer _timer;//引用的是using System.Threading;
        private readonly TimeSpan _interval = TimeSpan.FromSeconds(20);//时间间隔20s
        public MyService()
        {
            InitializeComponent();
        }

        protected override void OnStart(string[] args)//服务开启自动调用该方法
        {
            _timer = new Timer(WriteTimeToFile, null, TimeSpan.Zero, _interval);//调用WriteTimeToFile方法,传递参数null,启动服务后立即实行一次,间隔20s执行
            File.AppendAllText("log.txt", "服务已开启!\n");
        }

        protected override void OnStop()//服务停止自动调用该方法
        {
            File.AppendAllText("log.txt", "服务已停止!\n");
        }

        private void WriteTimeToFile(object state)
        {
            string path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "log.txt");//path = 当前目录+"log.txt"
            File.AppendAllText(path, $"{DateTime.Now}: 当前时间记录\n");//写入一定内容(可以写你自己的逻辑)
        }
    }
}

【备注】new System.Threading.Timer(Method, objects, a, b); 这四个参数的含义:

  •     Method: 定时器触发时要调用的方法。
  •     objects: 定时器向Method传递的参数,不传递时可为null。
  •     a(int): 第一次调用定时器的方法之前的延迟时间(毫秒),如果设置为 TimeSpan.Zero,定时器将在创建时立即执行回调方法Method。
  •     b(int) :定时器调用方法的间隔时间(毫秒),如果设置为 TimeSpan.Zero,定时器将仅执行一次,不会重复调用。

 二、安装服务

以下两个安装方案,二选一即可!

1.方案一:利用VS2022安装文件的配置

选择添加安装程序

安装文件的介绍及配置

右键它们两个的属性,分别配置以下内容:

​ 重新编译

安装好后,重新编译该类库

工具安装

 然后使用命令行安装,首先用管理员身份打开cmd,然后输入以下命令进入到安装工具路径:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

 执行安装命令(注意改路径)

InstallUtil  F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe

测试发现程序正常运行:

2.方案二:编写bat脚本安装服务

 重新编译

首先,重新编译该类库

创建bat

第二,创建一个"安装服务.txt"文件,写入以下内容(二选一即可,记得改路径),然后将后缀改为bat

这里的命名TestService是自由的,如何命名都可以,路径是编译类库后debug输出的exe的路径(注意改路径改和服务名)

@echo off
sc create TestService binPath= "F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe" start= auto
sc start TestService
echo Service installed and started.
pause

 更便捷的写法:%~dp0 表示当前目录

@echo off
sc create TestService binPath= "%~dp0WindowsService1.exe" start= auto
sc start TestService
echo Service installed and started.
pause

 

运行bat 

第三步,【右键】-【管理员身份运行】-【安装服务】

出现下图说明安装好了!

三、调试服务

1.服务运行的原理

        将 C# 代码编译成 .exe 文件,并将该 .exe 文件安装为 Windows 服务后,实际运行的是这个 .exe 文件。虽然服务的生命周期由 Windows 服务管理,但服务内部的操作实际上是由 .exe 文件执行的。

        举个例子,爸爸(C#)编写了一个程序,并生成了小明(.exe)。小明去学校(服务),在学校中由老师(Windows 服务)来管理他的上学和放学时间(启停服务)。尽管学校负责管理小明的时间表,但小明在学校里执行的任务(.exe 的代码逻辑)决定了他完成的具体工作或效果。

2.调试

(1)建议:定时器间隔小一点,好调试

(2)步骤:

第一步,停止你的服务

第二步,重新编译你的服务类库(修改代码都要重新编译,重新编译会生成一个新的exe,如果不停止你的服务,将无法生成新的exe!导致编译失败,服务不能正常更新)

 第三步,启动你的服务

 第四步,VS2022附加类库生成的exe到进程,然后断点调试:

成功进入断点:

(3)更好的调试方法:

四、卸载服务

注意,理论上卸载方案二选一即可!推荐方案二,更快更简单~

方案一:VS2022配置卸载方法

 然后使用命令行安装,首先用管理员身份打开cmd,然后输入以下命令进入到安装工具路径:

cd C:\Windows\Microsoft.NET\Framework\v4.0.30319

 执行卸载命令(注意改路径)

InstallUtil  /u F:\C_program\ComputerServices_demo\WindowsService1\WindowsService1\bin\Debug\WindowsService1.exe

管理员身份打开cmd尝试执行,发现已经卸载成功(注意改服务名)

sc delete TestService

 方案二:bat脚本卸载方法:一停二删

 打开服务,停掉这个服务

 管理员身份打开cmd尝试执行,发现已经卸载成功(注意改服务名)

sc delete TestService

​五、常见问题

1.因编码导致的bat安装出错

尝试用notepad修改一下编码格式

2.如何写好一个服务

1.捕捉错误,打日志


2.间隔时间设置合理


3.插入数据库前判断
    ①避重:先查,没有再后插,避免冗余(也可以用主键或联合主键约束)
    ②避漏:确保在服务重启后插入之前缺失的数据(如昨天或前天的数据)。
    ③校验:只插入必要的数据,避免无用数据的插入。


4.批量插入而不是逐行插入


5.在查询或插入失败时,设置适当的重试机制(例如,延迟几秒后重试),以应对临时性问题(如接口异常或事务被占用)。

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

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

相关文章

Excel match 函数使用方法,和 index 函数是绝配

大家好,这里是效率办公指南! 🔎 在处理Excel数据时,我们经常需要找出特定数据在列表或数组中的位置。MATCH函数正是为此设计的,它可以返回一个值在指定数组中的相对位置。今天,我们将详细介绍MATCH函数的使…

MySQL基础(13)- MySQL数据类型

目录 一、数据类型概述 1.MySQL中的数据类型 二、整型 1.数据类型可选属性 2.使用建议 三、浮点数、定点数、位类型 1.类型介绍 2.浮点类型 3.定点数类型 4.位类型 四、日期时间类型 1.YEAR 2.DATE 3.TIME 4.DATETIME 5.TIMESTAMP 6.TIMESTAMP和DATETIME的区别…

Android Studio开发发布教程

本文讲解Android Studio如何发布APP。 在Android Studiobuild菜单栏下点击Generate Singed Bundle/APK…打开对话框。 选择APK点击Next 点击Create New...进行创建

Flask找上下文源码

1. app Flask(__name__) app.__call__ 1.1 按住 command 键 点击 进到这个函数里 1.2 接着找 return 看看返回什么 点进去 1.3 找到定义函数 1.4 点进去先看这个里边有啥 1.5 找到定义类 1.6 找到RequestContext 类 1.7 找到 RequestContext ---> 的push 方法 1.8 点击 _c…

Redis面试真题总结(二)

文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ 文章收录在网站:http://hardyfish.top/ Redis常见的数据类型有哪些? string 字符串 字符串类型…

Mobile net V系列详解 理论+实战(3)

Mobilenet 系列 论文精讲部分0.摘要1. 引文2. 引文3. 基础概念的讨论3.1 深度可分离卷积3.2 线性瓶颈3.3 个人理解 4. 模型架构细节5. 实验细节6. 实验讨论7. 总结 论文精讲部分 鉴于上一小节中采用的代码是V2的模型,因此本章节现对V2模型论文讲解,便于…

【C++二叉树】二叉树的前序遍历、中序遍历、后序遍历递归与非递归实现

1.二叉树的前序遍历 144. 二叉树的前序遍历 - 力扣(LeetCode) 前序遍历方式:根-左子树-右子树。 递归实现: 要传一个子函数来实先递归,原因是原函数返回值为vector,在原函数迭代,返回值就难…

基于python上门维修预约服务数据分析系统

目录 技术栈和环境说明解决的思路具体实现截图python语言框架介绍技术路线性能/安全/负载方面可行性分析论证python-flask核心代码部分展示python-django核心代码部分展示操作可行性详细视频演示源码获取 技术栈和环境说明 结合用户的使用需求,本系统采用运用较为广…

一、机器学习算法与实践_03概率论与贝叶斯算法笔记

1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目,是通过对 样本 的分析,来评估/估计 总体 的情况,与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…

Qt窗口——对话框

文章目录 对话框自定义对话框对话框分类消息对话框QMessageBox使用示例自定义按钮快速构造对话框 颜色对话框QColorDialog文件对话框QFileDialog字体对话框QFontDialog输入对话框QInputDialog 对话框 对话框可以理解成一个弹窗,用于短期任务或者简洁的用户交互 Qt…

AIoT智能工控板

在当今竞争激烈的商业环境中,企业需要强大的科技力量来助力腾飞,AIoT智能工控板就是这样的力量源泉。 其领先的芯片架构设计,使得主板的性能得到了极大的提升。无论是数据的处理速度、图形的渲染能力,还是多任务的并行处理能力&a…

【Linux笔记】虚拟机内Linux内容复制到宿主机的Window文件夹(文件)中

一、共享文件夹 I、Windows宿主机上创建一个文件夹 目录:D:\Centos_iso\shared_files II、在VMware中设置共享文件夹 1、打开VMware Workstation 2、选择需要设置的Linux虚拟机,点击“编辑虚拟机设置”。 3、在“选项”标签页中,选择“共…

【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析

2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用模型 问题分析 更新进展 【BetterBench博士】2024 “华为杯”第二十一届中国研究生数学建模竞赛 选题分析 【BetterBench博士】2024年中国研究生数学建模竞赛 E题:高速公路应急车道紧急启用…

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题

Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…

简单多状态dp第三弹 leetcode -买卖股票的最佳时机问题

309. 买卖股票的最佳时机含冷冻期 买卖股票的最佳时机含冷冻期 分析: 使用动态规划解决 状态表示: 由于有「买入」「可交易」「冷冻期」三个状态,因此我们可以选择用三个数组,其中: ▪ dp[i][0] 表示:第 i 天结束后&#xff0c…

探索AI编程新时代:GitHub Copilot如何重塑开发者工作效率

在当今技术瞬息万变的时代,软件开发者们每天都在努力寻找更高效的编程方法。面对繁忙的工作日程和不断增加的项目压力,如何在编码过程中大幅提升效率成为了一个备受关注的话题。在众多工具中,GitHub Copilot以其强大的AI驱动能力脱颖而出&…

菜鸟也能轻松上手的Java环境配置方法

初学者学习Java这么编程语言,第一个难题往往是Java环境的配置,今天与大家详细地聊一聊,以便大家能独立完成配置方法和过程。 首先,找到“JDK”,点击“archive”: 向下滑,在“previous java rel…

HTTPS:构建安全通信的基石

HTTPS(Hypertext Transfer Protocol Secure),作为互联网上安全通信的基石,通过在HTTP基础上引入SSL/TLS协议层,实现了数据传输的加密,确保了信息的机密性、完整性和真实性。这一过程涉及多个精细设计的步骤…

【EasyBlog】基于React+AntD+NextJS+NestJS+MySQL打造的开源博客系统

Github项目地址:https://github.com/fecommunity/easy-blog, 欢迎Star。 Easy-Blog Easy-Blog 是一套集成文章发表、页面创建、知识库管理、博客后台管理等功能于一体的博客系统。 首页-浅色主题 首页-暗黑主题 文章阅读 后台管理 ✨ 特性 &#…

公司网站改版时,需要注意哪些细节?

在公司网站改版时,需要注意的细节非常多,这些细节将直接影响到网站的用户体验、SEO效果以及整体品牌形象。以下是一些关键的注意事项: 明确改版目标: 在改版前,要明确改版的目标是什么,比如提升用户体验、增…