Backgroundservice, ExecuteAsync, StartAsync, StopAsync, Giga
https://gsmainprojects.blogspot.com/2026/06/2606-quotegeneratorworker-quote.html
D:\Projects\VS\2606\Quotes\Giga\QuoteGeneratorWorkerSln\QuoteGeneratorWorkerSln.slnx
D:\Projects\VS\2606\Quotes\Giga\QuoteGeneratorWorkerSln\QuoteGeneratorWorker\QuoteGeneratorWorker.csproj
--------------------------------------------------------------------------------------------------
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
try
{
_logger.LogInformation("📈 Генератор котировок запущен.");
while (!stoppingToken.IsCancellationRequested)
{
var quotesBatch = GenerateQuotesBatch();
_logger.LogDebug($"--- Новая порция котировок ({quotesBatch.Count} шт.) ---");
// Параллельная обработка текущей партии котировок
await Parallel.ForEachAsync(
quotesBatch,
new ParallelOptions
{
MaxDegreeOfParallelism = Environment.ProcessorCount,
CancellationToken = stoppingToken
},
async (quote, token) =>
{
await _handler.HandleAsync(quote, token);
});
// Ждем перед генерацией следующей порции
await Task.Delay(TimeSpan.FromSeconds(1), stoppingToken);
}
_logger.LogInformation("🛑 Генератор котировок остановлен.");
}
catch (OperationCanceledException)
{
// Эта секция выполнится, когда сервис остановят
_logger.LogInformation("Фоновая задача была корректно прервана.");
}
finally
{
// Здесь можно освободить ресурсы, если они есть
_logger.LogInformation("Сервис QuoteGeneratorService полностью остановлен.");
}
}
----------------------------------------------------------------------------
// --- НОВАЯ РЕАЛИЗАЦИЯ СТАРТА ---
public override async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("📈 Генератор котировок готовится к запуску...");
// Здесь может быть логика инициализации, например:
// await InitializeDatabaseConnectionAsync(cancellationToken);
_logger.LogInformation("🚀 Инициализация завершена. Запуск основного цикла.");
// Вызываем стандартный старт, который начнет ExecuteAsync
await base.StartAsync(cancellationToken);
}
---------------------------------------------------------------------------------
public override async Task StopAsync(CancellationToken cancellationToken)
{
_logger.LogWarning("⚠️ Получен сигнал об остановке сервиса.");
// Здесь может быть логика очистки, например:
// await SaveFinalStateToDatabaseAsync(cancellationToken);
// CloseFileHandles();
// _logger.LogInformation("🛑 Сервис успешно остановлен.");
// Вызываем стандартную остановку
await base.StopAsync(cancellationToken);
}
Комментариев нет:
Отправить комментарий