网站首页 > 基础教程 正文
摘要
Worker Service是微软提供的一个项目模板,它基于BackgroundService并且可以在Windows和.NET Core平台上使用。通过使用Worker Service,开发者可以创建跨平台的服务,并且可以使用BackgroundService中的功能,如延迟任务执行和后台任务处理。使用Worker Service的优势在于,它可以轻松地与.NET Core应用程序集成,同时还可以提供可重用的后台任务功能,以帮助开发者更好地管理服务器上的任务。
正文
创建长时间运行的服务的原因有很多,例如:
- 处理 CPU 密集型数据。
- 在后台排队工作项。
- 按计划执行基于时间的操作。
通常,后台服务不需要直接处理用户界面(UI),但可以围绕它们构建UI。在早期的 .NET Framework中,开发人员可以通过创建Windows服务来实现这一点。现在,有了 .NET,您可以使用 BackgroundService,它是 IHostedService 的实现,也可以实现自己的实现。
创建一个Worker Service 项目
个人习惯勾上Do not use top-level statements
项目创建好了,直接运行看看效果
在Program.cs中,CreateHostBuilder方法用于创建一个添加了Worker类作为托管服务的host,然后使用Build方法生成实例并调用Run方法来运行该实例。这与传统的控制台应用程序的结构类似。
public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build();
host.Run();
}
}
我们再来看一下Worker类,继承了BackgroundService类
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
BackgroundService类有几个虚方法
StartAsync会在服务开启时被调用
StopAsync则是在服务停止时被调用
ExecuteAsync是必须要被实现的方法,它定义了服务运行时需要执行的操作。
我们加载一下NLog
nuget 安装依赖
NLog
NLog.Extensions.Logging
修改Program,启用nLog
using Microsoft.Extensions.DependencyInjection;
using NLog.Extensions.Logging;
namespace wsHello
{
public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureLogging((host, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" });
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build();
host.Run();
}
}
}
创建一个Plc类
public class Plc
{
private readonly ILogger<Plc> _logger;
public Plc(ILogger<Plc> logger)
{
_logger = logger;
}
public object Read()
{
_logger.LogInformation("读Plc信息");
return null;
}
}
修改注入
public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureLogging((host, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" });
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddSingleton<Plc>();//单例注入
})
.Build();
host.Run();
}
}
修改Worker
private readonly ILogger<Worker> _logger;
private readonly Plc _plc;
public Worker(ILogger<Worker> logger, Plc plc)
{
_logger = logger;
_plc = plc;
}
/// <summary>
/// 执行服务
/// </summary>
/// <param name="stoppingToken"></param>
/// <returns></returns>
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
_plc.Read();
await Task.Delay(1000, stoppingToken);
}
}
Windows环境下部署服务
说明 | 命令 |
安装服务 | sc.exe create 服务名 binPath=路径 |
安装服务 | sc.exe delete 服务名 |
启动服务 | sc.exe start 服务名 |
停止服务 | sc.exe stop 服务名 |
为了执行这些命令,您需要使用管理员权限的CMD或PowerShell。
nuget 安装依赖
Microsoft.Extensions.Hosting.WindowsService
这里需要注意版本,我这用的.net 6,安装8.0会出错,我降到6.02版本没问题了。
修改Program
public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.UseWindowsService()//注册服务
.ConfigureLogging((host, logging) =>
{
logging.ClearProviders();
logging.SetMinimumLevel(LogLevel.Trace);
logging.AddNLog(host.Configuration, new NLogProviderOptions() { LoggingConfigurationSectionName = "NLog" });
})
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
services.AddSingleton<Plc>();//单例注入
})
.Build();
host.Run();
}
}
安装服务
C:\Windows\System32>sc.exe create wshello binpath=D:\BaiduSyncdisk\11Test\wsHello\wsHello\bin\Debug\net6.0\wsHello.exe
[SC] CreateService SUCCESS
在service中找一个这个服务
起动服务
删除服务
C:\Windows\System32>sc.exe delete wshello
[SC] DeleteService SUCCESS
猜你喜欢
- 2024-12-28 CSnakes:在.NET项目中嵌入Python代码的工具
- 2024-12-28 巧用泛型设计模式,提升代码质量新高度
- 2024-12-28 巅峰对决!Spring Boot VS .NET 6 巅峰对决之干碎龙王短剧全集完整版第5集
- 2024-12-28 基于C#开发的物联网设备通讯协议客户端终身开源免费
- 2024-12-28 C# Flurl 库浅析(一) c#folderbrowserdialog
- 2024-12-28 C# Lazy的缺点 c#的介绍
- 2024-12-28 微服务——webapi实现,脱离iis,脱离tomcat
- 2024-12-28 C# 和 .NET 开发的 10 种基本模式
- 2024-12-28 基于C# 开发的物联网设备通讯协议客户端
- 2024-12-28 C# .NET 6 校园图书管理系统:第14章 .Net6 Excel文件导入导出
- 最近发表
- 标签列表
-
- gitpush (61)
- pythonif (68)
- location.href (57)
- tail-f (57)
- pythonifelse (59)
- deletesql (62)
- c++模板 (62)
- css3动画 (57)
- c#event (59)
- linuxgzip (68)
- 字符串连接 (73)
- nginx配置文件详解 (61)
- html标签 (69)
- c++初始化列表 (64)
- exec命令 (59)
- canvasfilltext (58)
- mysqlinnodbmyisam区别 (63)
- arraylistadd (66)
- node教程 (59)
- console.table (62)
- c++time_t (58)
- phpcookie (58)
- mysqldatesub函数 (63)
- window10java环境变量设置 (66)
- c++虚函数和纯虚函数的区别 (66)