0

0

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

星降

星降

发布时间:2025-12-12 20:36:07

|

967人浏览过

|

来源于php中文网

原创

答案:在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):

析稿Ai写作
析稿Ai写作

科研人的高效工具:AI论文自动生成,十分钟万字,无限大纲规划写作思路。

下载
  • 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 运行)

基本上就这些。重点不在“怎么注册”,而在“怎么写得稳”:响应及时启停、不卡主线程、不泄漏资源、不假定用户环境。服务不是高级控制台程序,它是操作系统级的长期协作者。

相关专题

更多
session失效的原因
session失效的原因

session失效的原因有会话超时、会话数量限制、会话完整性检查、服务器重启、浏览器或设备问题等等。详细介绍:1、会话超时:服务器为Session设置了一个默认的超时时间,当用户在一段时间内没有与服务器交互时,Session将自动失效;2、会话数量限制:服务器为每个用户的Session数量设置了一个限制,当用户创建的Session数量超过这个限制时,最新的会覆盖最早的等等。

311

2023.10.17

session失效解决方法
session失效解决方法

session失效通常是由于 session 的生存时间过期或者服务器关闭导致的。其解决办法:1、延长session的生存时间;2、使用持久化存储;3、使用cookie;4、异步更新session;5、使用会话管理中间件。

740

2023.10.18

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

88

2025.08.19

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

481

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

269

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

210

2023.12.29

console接口是干嘛的
console接口是干嘛的

console接口是一种用于在计算机命令行或浏览器开发工具中输出信息的工具,提供了一种简单的方式来记录和查看应用程序的输出结果和调试信息。本专题为大家提供console接口相关的各种文章、以及下载和课程。

412

2023.08.08

Java JVM 原理与性能调优实战
Java JVM 原理与性能调优实战

本专题系统讲解 Java 虚拟机(JVM)的核心工作原理与性能调优方法,包括 JVM 内存结构、对象创建与回收流程、垃圾回收器(Serial、CMS、G1、ZGC)对比分析、常见内存泄漏与性能瓶颈排查,以及 JVM 参数调优与监控工具(jstat、jmap、jvisualvm)的实战使用。通过真实案例,帮助学习者掌握 Java 应用在生产环境中的性能分析与优化能力。

19

2026.01.20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.1万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 13万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号