C# Topshelf 搭建 Windows 服务
Topshelf 是一个用来部署基于.NET Framework 开发的服务的框架。简化服务创建于部署过程,并且支持控制台应用程序部署为服务。本文基于 .net core 控制台应用程序部署为服务(.net Framework 可用)。
第一步:创建名为 TopshelfDemo 的控制台应用程序
第二步:通过 Nuget 安装 Topshelf 包
第三步:Toshelf 配置,代码并不多下面都有注释
using System;
using Topshelf;
namespace TopshelfDemo
{
class Program
{
static void Main(string[] args)
{
try
{
// 配置和运行宿主服务
HostFactory.Run(x => //1
{
x.Service<Service>(s => //2
{
// 指定服务类型。这里设置为 Service
s.ConstructUsing(name => new Service()); //3
// 当服务启动后执行什么
s.WhenStarted(tc => tc.Start()); //4
// 当服务停止后执行什么
s.WhenStopped(tc => tc.Stop()); //5
});
// 服务用本地系统账号来运行
x.RunAsLocalSystem(); //6
// 服务描述信息
x.SetDescription("我的项目服务"); //7
// 服务显示名称
x.SetDisplayName("MyProjectServiceShowName"); //8
// 服务名称
x.SetServiceName("MyProjectService"); //9
});
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
public class Service
{
public void Start() {
//To do something
}
public void Stop() {
//To do something
}
}
}
第四步:安装服务
确保项目正常生成,然后通过管理员权限打开 cmd 命令窗口,找到项目所在的 Debug 目录,输入命令:TopshelfDemo.exe install或者双击文件
如果是使用 .net core 的小伙伴你会发现 Debug下压根没有 TopshelfDemo.exe ,这不是扯淡呢么,别急往下看。
由于 .net core 依赖 runtimes 所以我们需要发布以下程序,并且选择独立项目就ok啦。
注意要用管理员模式身份运行
后续:增加quartz MainService 作为topshelf的服务类
public class MainService
{
private readonly ILog _logger = LogManager.GetLogger(typeof(MainService));
public async Task Start()
{
_logger.Debug($"Service Starting");
LogProvider.IsDisabled = true;
// 开启调度
ISchedulerFactory sf = new StdSchedulerFactory();
IScheduler scheduler = await sf.GetScheduler();
IJobDetail job1 = JobBuilder.Create<AlarmJob>().Build();
IJobDetail job2 = JobBuilder.Create<LightJob>().Build();
//// 服务启动时执行一次
//ITrigger triggerNow = TriggerBuilder.Create().StartNow().Build();
//
ITrigger trigger1 = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x=>x.WithIntervalInSeconds(PointsReader.IntervalSec).RepeatForever())
.Build();
ITrigger trigger2 = TriggerBuilder.Create()
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(PointsReader.IntervalSec).RepeatForever())
.Build();
await scheduler.ScheduleJob(job1, trigger1);
await scheduler.ScheduleJob(job2, trigger2);
await scheduler.Start();
//To do something
_logger.Debug($"Service Started end");
}
public void Stop()
{
_logger.Debug($"Service Stop");
//To do something
}
}
评论区