簡體   English   中英

在 .NET 中啟動 Windows 后台服務的參數

[英]Start arguments for Windows Background Service in .NET

我正在使用 .NET 的BackgroundService抽象類(類似於 Microsoft 在本教程中的類)創建 Windows 服務,但我似乎無法弄清楚如何使用 Windows 服務應用程序將啟動參數傳遞給服務。 有人可以告訴我如何獲得我在那里傳遞的論點或我應該做什么嗎?

您必須從Main傳遞參數:

public static async Task Main(string[] args)
{
    IHost host = Host.CreateDefaultBuilder(args)
        .ConfigureLogging(options =>
        {
            options.ClearProviders();
            options.AddEventLog();
            options.AddConsole();
        })
        .UseWindowsService(options =>
        {
            options.ServiceName = "WorkerServiceTestArgs";
        })
        .ConfigureServices(services =>
        {
            services.AddSingleton(new MyArgsService(args));
            services.AddHostedService<Worker>();
        })
        .Build();

    await host.RunAsync();
}

然后,您的工作人員依賴於您的服務:

public class Worker : BackgroundService
{
    private readonly ILogger<Worker> _logger;
    private readonly MyArgsService _myArgsService;

    public Worker(ILogger<Worker> logger, MyArgsService myArgsService)
    {
        _logger = logger;
        _myArgsService = myArgsService;
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        while (!stoppingToken.IsCancellationRequested)
        {
            _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
            _logger.LogInformation("Args: {args}", string.Join(";", _myArgsService.GetArgs()));

            await Task.Delay(1000, stoppingToken);
        }
    }
}

例如,使用這個簡單的服務:

public class MyArgsService
{
    private readonly string[] _args;

    public MyArgsService(string[] args)
    {
        _args = args;
    }

    public string[] GetArgs()
    {
        return _args;
    }
}

結果:

Windows 服務配置

事件簿

創建一個派生自ServiceBase的類以接收參數並實現IHostLifetime

public class MyServiceLifetime : ServiceBase, IHostLifetime
{
    protected override void OnStart(string[] args)
    {
        base.OnStart(args);
    }

    public public Task WaitForStartAsync(CancellationToken cancellationToken)
        => Task.CompletedTask;
    
    public Task StopAsync(CancellationToken cancellationToken)
        => Task.CompletedTask;
}

將此類替換為UseWindowsService

using IHost host = Host.CreateDefaultBuilder(args)
    .ConfigureServices(services =>
    {
        services.AddSingleton<IHostLifetime, MyServiceLifetime>();
        services.AddSingleton<JokeService>();
        services.AddHostedService<WindowsBackgroundService>();
    })
    .Build();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM