четверг, 4 июня 2026 г.

Cancel, Backgroundservice, Project

Cancel, Backgroundservice, Project
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);
}

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

Отправить комментарий