新闻中心
C# 如何创建Windows服务 - 后台长时间运行任务的实现
答案:在Windows上用C#创建稳定服务需继承ServiceBase,重写OnStart/OnStop,启动后台任务不阻塞主线程,安全停止并释放资源,避免UI操作,通过sc.exe或InstallUtil注册服务,推荐使用Worker Service + Microsoft.Extensions.Hosting.WindowsServices实现跨平台兼容,注重日志记录与调试设计。

在 Windows 上用 C# 创建服务,核心是让程序以系统服务方式运行,不依赖用户登录、不显示界面、能随系统启动自动运行。关键不是“写个控制台程序然后装成服务”,而是从设计上遵循 Windows 服务生命周期(OnStart/OnStop)、避免 UI 操作、正确处理异常和资源释放。
使用 ServiceBase 基类实现服务主体
新建一个“Windows Service (.NET Framework)”项目(注意:.NET Core/.NET 5+ 不直接支持传统 Windows Service 模板,需用 Worker Service + Topshelf 或 Microsoft.Extensions.Hosting.WindowsServices;本文以经典 .NET Framework 为例)。
你的主服务类需继承 ServiceBase,重写 OnStart 和 OnStop 方法:
- OnStart 中不要阻塞——启动后台线程、Timer、Task 或托管 Host(如 IHostedService),真正的工作逻辑放在这里启动,而非在 OnStart 里死循环
- OnStop 中必须安全停止所有后台操作(如调用 CancellationTokenSource.Cancel()、timer.Stop()、await _host.StopAsync()),并等待其完成,避免服务被强制终止
- 禁止在服务中调用 MessageBox、Console.WriteLine(无交互会话)、打开窗口或访问用户桌面——系统服务默认运行在 Session 0,与用户会话隔离
安装与卸载服务(sc.exe 或 InstallUt
il.exe)
编译后生成可执行文件(.exe),它本身不是服务,需注册到 Windows 服务控制管理器(SCM):
Procys
AI驱动的发票数据处理
102
查看详情
- 用 InstallUtil.exe(位于 %WINDIR%\Microsoft.NET\Framework\v4.0.30319\):
InstallUtil.exe YourService.exe - 或用 sc.exe(更轻量,无需 .NET SDK):
sc create "MyBackupService" binPath= "C:\path\YourService.exe" start= auto
注意等号后有空格,binPath= 后不能有空格,start= auto 表示自动启动 - 卸载服务:sc delete "MyBackupService" 或 InstallUtil /u YourService.exe
调试技巧:避免每次安装/启动服务再试
服务无法直接按 F5 调试。推荐两种高效方式:
- 条件编译 + 控制台模式:在 Main 方法中判断是否带参数(如 --console),有则以控制台方式运行(调用 OnStart + Console.ReadKey() + OnStop),方便断点调试
- 附加到进程:先手动启动服务(services.msc → 右键启动),再在 Visual Studio 中「调试 → 附加到进程」,找到你的服务进程(通常同名 exe)即可设断点
- 日志必不可少:用 NLog 或 Serilog 写入文件(路径避开 C:\Users,推荐 C:\ProgramData\YourApp\Logs\),别依赖 Event Log(初期不易排查)
.NET 5/6/7+ 推荐方案:Worker Service + Windows Service 支持
新项目应优先选 Worker Service 模板,再通过 NuGet 引用 Microsoft.Extensions.Hosting.WindowsServices:
- 在 Program.cs 中调用 host.UseWindowsService(),自动适配服务生命周期
- 把业务逻辑封装为 IHostedService 实现类(如 BackgroundService 子类),在 StartAsync 中启动定时任务,在 StopAsync 中清理
- 发布后用 sc create 注册即可,无需 InstallUtil;且支持跨平台开发(只是 Windows Service 功能仅限 Windows 运行)
基本上就这些。重点不在“怎么注册”,而在“怎么写得稳”:响应及时启停、不卡主线程、不泄漏资源、不假定用户环境。服务不是高级控制台程序,它是操作系统级的长期协作者。
以上就是C# 如何创建Windows服务 - 后台长时间运行任务的实现的详细内容,更多请关注其它相关文章!
# 序列化
# 营口网站推广巍馨hfqjwl下拉
# 无极网站建设规格尺寸图
# 网站推广图书
# seo的十二个问题
# 公司网站推广哪家强
# 关键词文章排名
# 青岛网站seo推广营销
# 东莞政府机关网站建设
# 企业网站的推广手段有哪些
# 潢川seo推广引流公司
# 推荐使用
# 而在
# 两种
# 放在
# c#
# 重写
# 长时间
# 如何使用
# 子类
# .net
# microsoft
# win
# amd
# ai
# session
# app
# 操作系统
# windows
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
qq浏览器如何查看和导出已保存的密码 qq浏览器密码管理器数据备份教程
腾讯QQ邮箱登录入口_QQ邮箱官方网站使用地址
12306选座怎么选到商务座_12306商务座选择与配置说明
Excel函数批量查找替换超快方法_Excel用REPLACE和FIND函数秒级替换
php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】
支付宝如何管理隐私设置_支付宝隐私保护的配置技巧
淘宝网网页版登录入口 淘宝官方网页版快捷登录
126邮箱账号注册 电脑版登录入口
CSS子选择器:如何区分并样式化嵌套列表的子层级
神庙逃亡小游戏在线玩 神庙逃亡小游戏入口
taptap防沉迷怎么解除 taptap解除健康系统限制说明【2025最新】
韩剧圈正版入口页面_韩剧圈官网登录链接
必由学在线入口 必由学网页版快速登录入口
J*aScriptWebpack优化_J*aScript构建工具实战
composer的"require-dev"部分是用来做什么的?
如何修改开机登录密码_Windows账户安全设置超详细教程【必学】
J*aScript中安全有效地处理localStorage字符串数据
b站怎么看视频的弹幕数量_b站弹幕数量查看方法
AO3网页版最新入口合集 Archive of Our Own在线访问指南
知音漫客正版漫画平台_知音漫客官网账号登录
C#使用XPath查询节点时出错? 常见语法错误与调试技巧
Lar*el表单中优雅地处理“返回”按钮以规避验证:最佳实践指南
outlook中文官网入口地址 outlook官方中文版直达首页链接
批改网学生版PC登录 批改网官网登录系统入口
Lar*el Form Request中唯一性验证在更新操作中的正确实现
浏览器打开即用 美图秀秀网页版入口
在Socket.IO连接中实现Access Token自动更新与动态重连
Typer应用中动态命令行参数的解析与处理
没有大陆身份证/银行卡如何实名微信? 亲测有效的几种方法分享
QQ邮箱网页版登录入口 QQ邮箱官方在线使用平台
京东单号查询入口_京东快递订单追踪入口
顺丰快递查询系统 官方正版查询入口
qq游戏大厅官方下载_qq游戏免费下载安装入口
蛙漫正版漫画平台入口_蛙漫免费阅读全站漫画资源
谷歌google账号怎么注册账号 谷歌账号注册官方流程
红果短剧网页版官网入口 官方最新网址发布
向日葵客户端怎么进行远程CentOS控制_向日葵客户端远程CentOS控制操作教程
微博网页版主页入口 微博官方网站免登录访问
深入理解J*aScript中的B样条曲线与节点向量生成
C++ string find函数返回值npos详解_C++字符串查找失败的判断条件
2025-2030年全球乘用车销量预测:新能源成增长主力
qq游戏跨平台入口_qq游戏多设备同步登录
Angular中单选按钮的正确使用与常见陷阱解析
在Blazor WebAssembly应用中动态注入客户端特定指标代码的策略
铁路12306官网网页端快速入口 铁路12306官方首页登录教程
苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】
漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
火狐浏览器占用内存高卡顿怎么办 火狐浏览器性能优化设置技巧
J*aScript map 迭代中检测空数组元素的有效方法


2025-12-12
浏览次数:次
返回列表
il.exe)