在C#中创建Windows服务用于后台守护进程运行,最简便的方式是使用.NET的Worker Service模板。它把长期运行的后台任务封装成托管服务,既能跨平台,也能方便部署为Windows服务。下面以实际步骤说明如何从零搭建并安装一个守护进程。

一、创建Worker Service项目
打开命令行或Visual Studio,使用.NET CLI创建一个Worker Service项目:
dotnet new worker -n MyDaemonService cd MyDaemonService
默认生成的项目中包含Worker.cs文件,它继承自BackgroundService,这是后台任务的核心类。
二、编写守护进程逻辑
打开Worker.cs,重写ExecuteAsync方法,在里面写循环执行的任务。注意要用CancellationToken响应停止信号。
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// 守护进程主循环,每5秒输出一次心跳
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("守护进程运行中,时间: {time}", DateTimeOffset.Now);
await Task.Delay(5000, stoppingToken);
}
}
}
如果在代码中需要读取配置,可在Program.cs里通过Host.CreateDefaultBuilder添加配置源。
三、配置为Windows服务
要让程序以Windows服务方式运行,需要引用Microsoft.Extensions.Hosting.WindowsServices包,并在Program.cs中调用UseWindowsService。
using Microsoft.Extensions.Hosting;
Host.CreateDefaultBuilder(args)
.UseWindowsService(options =>
{
options.ServiceName = "MyDaemonService";
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build()
.Run();
添加包的命令如下:
dotnet add package Microsoft.Extensions.Hosting.WindowsServices
四、发布与安装服务
先发布为独立可执行文件:
dotnet publish -c Release -r win-x64 --self-contained true -o ./publish
然后使用系统自带的sc命令安装服务,需以管理员身份运行CMD:
sc create MyDaemonService binPath= "C:pathtopublishMyDaemonService.exe" sc start MyDaemonService
也可使用nssm等工具,但原生sc已能满足基本守护进程需求。
五、常见问题与注意点
- 服务账户默认是LocalSystem,若需访问网络资源可改为指定用户。
- 日志建议接入EventLog或文件,方便排查,可使用
AddEventLog扩展。 - 避免在主循环里写阻塞代码,应使用异步方法保证服务可正常停止。
Worker Service让C#后台守护进程的开发脱离繁琐的ServiceBase模板,配合UseWindowsService即可平稳转为Windows服务,是构建轻量守护程序的首选方案。
小结
通过上述步骤,我们完成了从创建C# Worker Service项目、编写后台逻辑、配置Windows服务到安装运行的完整流程。这种方式结构清晰,易于维护,适合各类需要在系统级长期运行的后台任务。
C#Windows服务Worker_Service修改时间:2026-07-28 01:12:23