惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
V
V2EX
美团技术团队
H
Help Net Security
月光博客
月光博客
爱范儿
爱范儿
Engineering at Meta
Engineering at Meta
The Cloudflare Blog
U
Unit 42
大猫的无限游戏
大猫的无限游戏
Recent Announcements
Recent Announcements
A
About on SuperTechFans
博客园 - Franky
The GitHub Blog
The GitHub Blog
N
Netflix TechBlog - Medium
人人都是产品经理
人人都是产品经理
博客园 - 司徒正美
MyScale Blog
MyScale Blog
B
Blog
雷峰网
雷峰网
Y
Y Combinator Blog
云风的 BLOG
云风的 BLOG
T
The Blog of Author Tim Ferriss

博客园 - 网络来者

Element Plus 多页面后台与 ASP.NET Core API 从零手敲教程 从零创建 MESTOOLS 消息弹窗跟练教程 uni app开发一个子页面 MES物料分摊 墨西哥 嘉兴 兼容车牌摄像头 和 tplink 摄像头的sdk开发包 集成 训练数字识别模型 tplink摄像头监控 mes测试机 redis vue学习 vue 系统文件结构 udp server 监听服务 c# 开发相关 openclaw 安装 c# 版本号 oracle 触发器 脚本方式安装Python 特定版本 idea 激活 Chrome MCP Server mcp ok mcp_server RepositoryItemGridLookUpEdit 使用 ok devexpress gridcontrol表格知识 winfrom 弹文本框 松下贴片机解锁 Serilog日志组件使用 git 使用
第一个服务
网络来者 · 2026-03-31 · via 博客园 - 网络来者
using System;
using System.IO;
using System.ServiceProcess;
using System.Threading;
using System.Threading.Tasks;

namespace MyDelayService
{
    public partial class DelayTaskService : ServiceBase
    {
        private Task _mainTask;
        private CancellationTokenSource _cts;
        //private readonly string _logPath;

        public DelayTaskService()
        {
            InitializeComponent();
            ServiceName = "My4HourDelayService";

            // 日志文件路径:exe所在目录\Log\yyyy-MM-dd.log
            //_logPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log");
            //if (!Directory.Exists(_logPath))
            //    Directory.CreateDirectory(_logPath);
        }

        // 服务启动
        protected override void OnStart(string[] args)
        {
            WriteLog("服务已启动");

            _cts = new CancellationTokenSource();
            _mainTask = RunLoopTaskAsync(_cts.Token);
        }

        // 服务停止
        protected override void OnStop()
        {
            WriteLog("服务正在停止...");
            _cts?.Cancel();
            _mainTask?.Wait();
            WriteLog("服务已停止");
        }

        /// <summary>
        /// 循环任务:每隔指定时间执行一次
        /// </summary>
        private async Task RunLoopTaskAsync(CancellationToken token)
        {
            try
            {
                while (!token.IsCancellationRequested)
                {
                    WriteLog("开始执行任务");

                    // ========== 执行你的业务 ==========
                    DoYourWork();

                    // ========== 等待后再次执行 ==========
                    // 5分钟:5 * 60 * 1000
                    // 4小时:4 * 60 * 60 * 1000
                    var waitTime = 5 * 60 * 1000;

                    WriteLog($"任务执行完成,等待 {waitTime / 60000} 分钟后再次执行");
                    await Task.Delay(waitTime, token);
                }
            }
            catch (TaskCanceledException)
            {
                WriteLog("循环任务已取消(正常停止)");
            }
            catch (Exception ex)
            {
                WriteLog($"循环任务异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 你的业务逻辑
        /// </summary>
        private void DoYourWork()
        {
            try
            {
                // 在这里写你要执行的代码
                WriteLog("业务逻辑执行成功!");
            }
            catch (Exception ex)
            {
                WriteLog($"业务执行失败:{ex.Message}");
            }
        }

        /// <summary>
        /// 写入日志文件
        /// </summary>
        public void WriteLog(string msg)
        {
            try
            {
                XLog.XTrace.WriteLine(msg);
            }
            catch { }
        }
    }
}

步骤 1:打开你的服务主文件

比如 Service1.csMyDelayService.cs(双击打开)

步骤 2:添加安装程序(自动生成)

  1. 在服务设计界面空白处右键
  2. 选择 添加安装程序(Add Installer)

✅ 完成后,项目会自动生成两个文件:

  • ProjectInstaller.cs(核心)
  • ServiceInstaller1
  • ServiceProcessInstaller1

步骤 3:配置安装程序(必须设置)

双击打开 ProjectInstaller.cs,分别设置两个组件的属性:

1)选中 serviceProcessInstaller1

设置 Account = LocalSystem

(本地系统权限,最常用)

2)选中 serviceInstaller1
  • ServiceName: 你的服务名称(必须和代码里一致)
  • DisplayName: 服务在系统里显示的名字
  • StartType: Automatic(自动启动)/ Manual(手动)

步骤 4:重新生成项目

在 VS 里点击:

生成 → 重新生成解决方案

用 VS2022 自带的「开发者命令提示符」(最简单、不会出错)

  1. 打开开始菜单 → 找到 Visual Studio 2022
  2. 点开文件夹,选择 Developer Command Prompt for VS 2022

    (中文叫:VS 2022 开发人员命令提示符

  3. 在弹出的黑窗口里,cd 进入你的 exe 目录

cd D:\vs2022proj\MyDelayService\bin\Debug

installutil MyDelayService.exe

installutil /u MyDelayService.exe