C#怎么创建Windows服务 C#编写后台服务程序方法

C#中创建Windows服务需继承ServiceBase类(.NET Framework)或使用Worker Service+UseWindowsService(.NET 6+),通过InstallUtil/sc create安装,由SCM管理启动停止。

在C#中创建Windows服务,核心是继承 ServiceBase 类,并通过安装工具注册到Windows服务管理器。它不是普通控制台或WinForm程序,不能直接双击运行,必须安装后由SCM(服务控制管理器)启动。

一、新建Windows服务项目(.NET Framework)

注意:.NET Core / .NET 5+ 不再原生支持传统Windows服务项目模板,但可通过 Worker Service + Microsoft.Extensions.Hosting.WindowsServices 实现等效功能。以下以经典 .NET Framework 为例(兼容性好、教程多):

  • Visual Studio 中新建项目 → 选择“Windows Service (.NET Framework)”
  • 默认生成一个继承 ServiceBase 的类(如 Service1.cs
  • OnStart() 中写启动逻辑(如启动定时器、监听端口、轮询数据库)
  • OnStop() 中释放资源(关闭线程、断开连接、保存状态)

二、关键代码结构示例

以简单日志写入为例:

protected override void OnStart(string[] args)
{
    // 启动一个后台线程(或使用Timer),避免阻塞OnStart
    _timer = new Timer(WriteLog, null, TimeSpan.Zero, TimeSpan.FromMinutes(1));
}

private void WriteLog(object state)
{
    File.AppendAllText(@"C:\Logs\MyService.log", 
        $"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] Service is running.\r\n");
}

protected override void OnStop()
{
    _timer?.Dispose();
}

三、安装与部署服务

仅编译不等于可运行。必须安装才能被系统识别:

  • 给项目添加“安装程序”(右键服务设计器 → “添加安装程序”)→ 自动生成 ProjectInstaller.cs
  • 设置 serviceInstaller1.ServiceNameserviceProcessInstaller1.Account(推荐 LocalSystem 或指定域账户)
  • 命令行安装(管理员权限运行):
    InstallUtil.exe MyService.exe(路径需完整,InstallUtilC:\Windows\Microsoft.NET\Framework\v4.0.30319\ 下)
  • 卸载用:InstallUtil.exe /u MyService.exe

四、.NET 6/7/8 推荐方式:Worker Service + Windows Services 支持

更现代、跨平台友好的做法:

  • 新建“Worker Service”项目(.NET 6+)
  • NuGet 安装:Microsoft.Extensions.Hosting.WindowsServices
  • 修改 Program.cs
    Host.CreateDefaultBuilder(args).UseWindowsService()
  • Worker.csExecuteAsync 中写后台逻辑(支持 DI、配置、日志)
  • 发布后,用 sc create 命令注册:
    sc create MyWorkerService binPath= "D:\path\MyWorker.exe" start= auto

基本上就这些。核心区别在于:传统方式重在 ServiceBase 生命周期控制;新方式重在 Hosting 模型复用,更轻量、易测试、易维护。