答案:在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 或 InstallUtil.exe)
编译后生成可执行文件(.exe),它本身不是服务,需注册到 Windows 服务控制管理器(SCM):
- 用 InstallUtil.exe(位于 %WINDIR%Microsoft.NETFrameworkv4.0.30319):
InstallUtil.exe YourService.exe - 或用 sc.exe(更轻量,无需 .NET SDK):
sc create “MyBackupService” binPath= “C:pathYourService.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:ProgramdataYourappLogs),别依赖 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 运行)
基本上就这些。重点不在“怎么注册”,而在“怎么写得稳”:响应及时启停、不卡主线程、不泄漏资源、不假定用户环境。服务不是高级控制台程序,它是操作系统级的长期协作者。