В последнее время я использую. NET Core worker service
для создания windows службы. Я создал рабочий класс для проверки последовательности выполнения для каждого метода:
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace DemoWorkerService
{
public class Worker : BackgroundService
{
private readonly ILogger<Worker> _logger;
public Worker(ILogger<Worker> logger)
{
_logger = logger;
{
//block01
_logger.LogInformation("block01 running at: {time}", DateTimeOffset.Now);
}
}
public override async Task StartAsync(CancellationToken cancellationToken)
{
{
//block02
_logger.LogInformation("block02 running at: {time}", DateTimeOffset.Now);
}
await base.StartAsync(cancellationToken);
{
//block03
_logger.LogInformation("block03 running at: {time}", DateTimeOffset.Now);
}
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
while (!stoppingToken.IsCancellationRequested)
{
{
//block04
_logger.LogInformation("block04 running at: {time}", DateTimeOffset.Now);
}
await Task.Delay(1000, stoppingToken);
}
}
catch (TaskCanceledException)
{
//block05
_logger.LogInformation("block05 running at: {time}", DateTimeOffset.Now);
}
finally
{
//block06
_logger.LogInformation("block06 running at: {time}", DateTimeOffset.Now);
}
}
public override async Task StopAsync(CancellationToken cancellationToken)
{
{
//block07
_logger.LogInformation("block07 running at: {time}", DateTimeOffset.Now);
}
await base.StopAsync(cancellationToken);
{
//block08
_logger.LogInformation("block08 running at: {time}", DateTimeOffset.Now);
}
}
}
}
После того, как я запустил код в Visual Studio, через некоторое время я нажал Ctrl+C
, чтобы завершить работу службы, а затем получил вывод ниже:
info: DemoWorkerService.Worker[0]
block01 running at: 01/15/2020 14:14:12 +08:00
info: DemoWorkerService.Worker[0]
block02 running at: 01/15/2020 14:14:12 +08:00
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:12 +08:00
info: DemoWorkerService.Worker[0]
block03 running at: 01/15/2020 14:14:12 +08:00
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Development
info: Microsoft.Hosting.Lifetime[0]
Content root path: C:\MyProjects\DemoWorkerService\DemoWorkerService
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:13 +08:00
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:14 +08:00
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:15 +08:00
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:16 +08:00
info: DemoWorkerService.Worker[0]
block04 running at: 01/15/2020 14:14:17 +08:00
info: Microsoft.Hosting.Lifetime[0]
Application is shutting down...
info: DemoWorkerService.Worker[0]
block07 running at: 01/15/2020 14:14:17 +08:00
info: DemoWorkerService.Worker[0]
block05 running at: 01/15/2020 14:14:17 +08:00
info: DemoWorkerService.Worker[0]
block06 running at: 01/15/2020 14:14:17 +08:00
info: DemoWorkerService.Worker[0]
block08 running at: 01/15/2020 14:14:17 +08:00
Кажется, что BackgroundService
методы base.StartAsync
и base.StopAsync
играют очень важную роль, чтобы запускать и останавливать выполнение ExecuteAsync
, когда пользователь запускает и останавливает рабочий сервис.
Поэтому я сортирую последовательность выполнения каждого блока в моем коде sampe, некоторые блоки будут выполняться параллельно, я помещаю их в те же строки:
{User started service}
{block01}
{block02}
{base.StartAsync}
{block03} {block04}
{block04}
{block04}
{User stopped service} {block04}
{block07} {block04}
{base.StopAsync} {block04}
{block05}
{block06}
{block08}
Я надеваю не знаю, является ли мое понимание в приведенной выше последовательности точным или нет, что означает, что base.StartAsync
вызовет начало ExecuteAsync
, а base.StopAsync
вызовет остановку ExecuteAsync
?