新闻中心

C# 如何创建Windows服务 - 后台长时间运行任务的实现

2025-12-12
浏览次数:
返回列表
答案:在Windows上用C#创建稳定服务需继承ServiceBase,重写OnStart/OnStop,启动后台任务不阻塞主线程,安全停止并释放资源,避免UI操作,通过sc.exe或InstallUtil注册服务,推荐使用Worker Service + Microsoft.Extensions.Hosting.WindowsServices实现跨平台兼容,注重日志记录与调试设计。

c# 如何创建windows服务 - 后台长时间运行任务的实现

在 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,重写 OnStartOnStop 方法:

  • OnStart 中不要阻塞——启动后台线程、Timer、Task 或托管 Host(如 IHostedService),真正的工作逻辑放在这里启动,而非在 OnStart 里死循环
  • OnStop 中必须安全停止所有后台操作(如调用 CancellationTokenSource.Cancel()、timer.Stop()、await _host.StopAsync()),并等待其完成,避免服务被强制终止
  • 禁止在服务中调用 MessageBox、Console.WriteLine(无交互会话)、打开窗口或访问用户桌面——系统服务默认运行在 Session 0,与用户会话隔离

安装与卸载服务(sc.exe 或 InstallUtil.exe)

编译后生成可执行文件(.exe),它本身不是服务,需注册到 Windows 服务控制管理器(SCM):

Procys Procys

AI驱动的发票数据处理

Procys 102 查看详情 Procys
  • 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 迭代中检测空数组元素的有效方法 

搜索