Worker Service是微软提供的一个项目模板,它基于BackgroundService并且可以在Windows和.NET Core平台上使用。通过使用Worker Service,开发者可以创建跨平台的服务,并且可以使用BackgroundService中的功能,如延迟任务执行和后台任务处理。使用Worker Service的优势在于,它可以轻松地与.NET Core应用程序集成,同时还可以提供可重用的后台任务功能,以帮助开发者更好地管理服务器上的任务。
创建长时间运行的服务的原因有很多,例如:
通常,后台服务不需要直接处理用户界面(UI),但可以围绕它们构建UI。在早期的 .NET Framework中,开发人员可以通过创建Windows服务来实现这一点。现在,有了 .NET,您可以使用 BackgroundService,它是 IHostedService 的实现,也可以实现自己的实现。
创建一个Worker Service 项目
个人习惯勾上Do not use top-level statements
项目创建好了,直接运行看看效果
在Program.cs中,CreateHostBuilder方法用于创建一个添加了Worker类作为托管服务的host,然后使用Build方法生成实例并调用Run方法来运行该实例。这与传统的控制台应用程序的结构类似。
C#public class Program
{
public static void Main(string[] args)
{
IHost host = Host.CreateDefaultBuilder(args)
.ConfigureServices(services =>
{
services.AddHostedService<Worker>();
})
.Build();
host.Run();
}
}
我们再来看一下Worker类,继承了BackgroundService类
C#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
C#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类
C#public class Plc
{
private readonly ILogger<Plc> _logger;
public Plc(ILogger<Plc> logger)
{
_logger = logger;
}
public object Read()
{
_logger.LogInformation("读Plc信息");
return null;
}
}
修改注入
C#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
C#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);
}
}
说明 | 命令 |
---|---|
安装服务 | 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
C#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#C:\Windows\System32>sc.exe create wshello binpath=D:\BaiduSyncdisk\11Test\wsHello\wsHello\bin\Debug\net6.0\wsHello.exe
[SC] CreateService SUCCESS
在service中找一个这个服务
起动服务
删除服务
C#C:\Windows\System32>sc.exe delete wshello
[SC] DeleteService SUCCESS
本文作者:技术老小子
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!