Кто запускает метод отмены CancellationTokenSource в размещенной службе .NET Core?

#.net #.net-core #cancellationtokensource

#.net #.net-core #cancellationtokensource

Вопрос:

Я реализовал startAsync в своем классе, который реализует IHostedService следующим образом:

 public async Task StartAsync(CancellationToken cancellationToken)
{
    Token = cancellationToken;
    IsRunning = true;
    Logger.LogInformation("Service start");
    await UploadDailyTotals().ConfigureAwait(false);
    Timer.Start();
}
  

Я присвоил полученный токен переменной класса. Я использую подход, основанный на таймере, для непрерывного запуска метода.

     async void Timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
    {
        try
        {
            if (IsRunning)
                await UploadDailyTotals().ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            Logger.LogError(ex.GetBaseException().Message);
        }
        finally
        {
            Timer.Start();
        }
    }
  

Часть uploadaddailytotals использует токен отмены, чтобы прекратить работу, если запрашивается отмена, но только после завершения всей работы в таком модуле:

     async Task UploadDailyTotals()
    {
        ...            
        while (sendDate <= endDate)
        {
            if (Token.IsCancellationRequested)
                return;
            ...work logic here...
        }
  

Это только часть метода, но он содержит все, что меня интересует.
Мой вопрос в том, запускает ли платформа метод отмены CancellationTokenSource при завершении работы приложения? До или после запуска метода StopAsync? Могу ли я вообще использовать токен, как показано здесь?

Комментарии:

1. … Я присвоил полученный токен переменной класса … . Кто / что создало токен? Откуда он берется?

2. Класс реализует IHostedService, поэтому он является частью контракта. Что касается того, откуда он берется, я предполагаю, что это знаменитая работа. Вот как вы настраиваете этот класс: Host. CreateDefaultBuilder() .ConfigureServices((hostContext, services) => { services. AddHostedService<YourServiceClass>(); })