Какова последовательность выполнения основной рабочей службы. NET - PullRequest
0 голосов
/ 15 января 2020

В последнее время я использую. 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?

...