#.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>(); })