专业编程基础技术教程

网站首页 > 基础教程 正文

231.C# 跨平台服务开发 c++跨平台开发

ccvgpt 2024-12-28 11:47:35 基础教程 38 ℃

摘要


Worker Service是微软提供的一个项目模板,它基于BackgroundService并且可以在Windows和.NET Core平台上使用。通过使用Worker Service,开发者可以创建跨平台的服务,并且可以使用BackgroundService中的功能,如延迟任务执行和后台任务处理。使用Worker Service的优势在于,它可以轻松地与.NET Core应用程序集成,同时还可以提供可重用的后台任务功能,以帮助开发者更好地管理服务器上的任务。

正文


创建长时间运行的服务的原因有很多,例如:

231.C# 跨平台服务开发 c++跨平台开发

  • 处理 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

Tags:

最近发表
标签列表