如何实现Windows服务
一、 遇到什么问题?
有些软件,需要每隔一定时间做一些相同的事情,或者作为网络服务,像IIS、SQL Server等这样的软件。此种情况下,往往需要让软件在没有用户干预的情况下在服务器上运行。与此种程序交互往往需要通过网络协议进行。或者程序根本就不需要与用户交互。这种程序往往称为后台程序,或后台服务。
二、 Windows服务能做些什么?
Windows服务是这些后台程序、后台服务的正规名词。Windows服务的运行可以在没有用户干预的情况下,在后台运行,没有任何界面。通过Windows服务管理器进行管理。服务管理器也只能做些简单的操作:开始,暂停,继续,停止。
Windows服务和普通的Windows窗体应用程序类型,只是没有了界面,连最简单的MessageBox也不能弹出来。所以不要试图在Windows服务里通过这种方式来提示用户。因为可能根本没有用户登录计算机。
Windows服务的特点:
在后台运行
没有用户交互
可以随Windows启动而启动
三、 如何实现Windows服务?
下面按“隔一定时间做一些相同的事情”的服务为例,说明Windows服务如何实现。
先按普通Windows程序设计好你的程序逻辑。
建立一个空白解决方案WindowsService.sln
添加Windows类库项目ServiceBusiness.csproj
将Class1.cs改名为ServiceBusiness.cs
添加一个方法Dothings(),这个方法用来每隔一段时间调用一次,做些周期性的事情。
namespace ServiceBusiness
{
public class ServiceBusiness
{
public void Dothings()
{
//隔一段时间调用一次
}
}
}
向解决方案添加一个WindowsService.csproj
将Service1.cs重命名为Service.cs
给WindowsService添加ServiceBusiness项目引用
打开Service.cs代码视图,向Service类添加成员
ServiceBusiness.ServiceBusiness serviceBusiness;
在构造函数里面对serviceBusiness实例化
serviceBusiness = new ServiceBusiness.ServiceBusiness();
在using位置添加System.Theading
using System.Threading;
给Service类添加计时器
Timer serviceTimer;
添加TimeCallback方法,用于计时器调用
{
//隔一段时间调用一次
serviceBusiness.Dothings();
}
在OnStart()方法中添加方法,用于启动计时器
serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period);
此处,state用于保存状态,如果不需要,保存状态,可以传入null。第三个参数0表示立即调用TimerCallback方法,如果不需要立即调用,可以传入period。period是计时器的计时间隔,单位为毫秒。
重载 OnPause ()和OnContinue ()方法,对计时器进行控制。
Service.cs代码如下
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.ServiceProcess;
using System.Text;
using System.Threading;
namespace WindowsService
{
public partial class Service : ServiceBase
{
Timer serviceTimer;
ServiceBusiness.ServiceBusiness serviceBusiness;
int period;
object state;
public Service()
{
InitializeComponent();
serviceBusiness = new ServiceBusiness.ServiceBusiness();
}
protected override void OnStart(string[] args)
{
//启动timer
period = ServiceSettings.Default.ServiceTimerIntervalSecond * 1000;
serviceTimer = new Timer(new TimerCallback(TimerCallback), state, 0, period);
}
protected override void OnStop()
{
//停止计时器
serviceTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
protected override void OnContinue()
{
//重新开始计时
serviceTimer.Change(0, period);
}
protected override void OnPause()
{
//停止计时器
serviceTimer.Change(Timeout.Infinite, Timeout.Infinite);
}
public void TimerCallback(object obj)
{
//隔一段时间调用一次
serviceBusiness.Dothings();
}
}
}
打开Program.cs文件
为了调试方便,在Main方法中,直接加入调用Dothings()。这样就可以在IDE中方便调试程序。
using System.ServiceProcess;
using System.Text;
namespace WindowsService
{
static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
static void Main(string[] args)
{
#if DEBUG
ServiceBusiness.ServiceBusiness serviceBusiness = new ServiceBusiness.ServiceBusiness();
//在调试模式下,直接调用
serviceBusiness.Dothings(args);
#else
ServiceBase[] ServicesToRun = new ServiceBase[] { new Service() };
ServiceBase.Run(ServicesToRun);
#endif
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)