51 lines
1.8 KiB
C#
51 lines
1.8 KiB
C#
|
|
using Bitget_Server.Application.Services;
|
||
|
|
|
||
|
|
namespace Bitget_Server.Application.BackgroundServices;
|
||
|
|
|
||
|
|
/// <summary>
|
||
|
|
/// 기존 MainForm.Signalnfo → IndicatorProcess.calProcess 무한 루프 이식.
|
||
|
|
/// SignalProcessService.ProcessOnceAsync 를 짧은 주기로 반복 호출한다.
|
||
|
|
/// </summary>
|
||
|
|
public class SignalProcessBackgroundService : BackgroundService
|
||
|
|
{
|
||
|
|
private readonly SignalProcessService _signalProcess;
|
||
|
|
private readonly ILogger<SignalProcessBackgroundService> _logger;
|
||
|
|
|
||
|
|
/// <summary>신호 검색 루프 1회 처리 후 대기 시간 (기존 while 루프는 Thread.Sleep 없이 반복되었으나 CPU 과점유 방지를 위해 200ms 부여).</summary>
|
||
|
|
private static readonly TimeSpan LoopInterval = TimeSpan.FromMilliseconds(200);
|
||
|
|
|
||
|
|
public SignalProcessBackgroundService(
|
||
|
|
SignalProcessService signalProcess,
|
||
|
|
ILogger<SignalProcessBackgroundService> logger)
|
||
|
|
{
|
||
|
|
_signalProcess = signalProcess;
|
||
|
|
_logger = logger;
|
||
|
|
}
|
||
|
|
|
||
|
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||
|
|
{
|
||
|
|
_logger.LogInformation("SignalProcessBackgroundService 시작 (Interval={Ms}ms)", LoopInterval.TotalMilliseconds);
|
||
|
|
|
||
|
|
while (!stoppingToken.IsCancellationRequested)
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
await _signalProcess.ProcessOnceAsync(stoppingToken).ConfigureAwait(false);
|
||
|
|
}
|
||
|
|
catch (OperationCanceledException) { /* shutdown */ }
|
||
|
|
catch (Exception ex)
|
||
|
|
{
|
||
|
|
_logger.LogWarning(ex, "SignalProcess 1회 처리 오류");
|
||
|
|
}
|
||
|
|
|
||
|
|
try
|
||
|
|
{
|
||
|
|
await Task.Delay(LoopInterval, stoppingToken).ConfigureAwait(false);
|
||
|
|
}
|
||
|
|
catch (OperationCanceledException) { /* shutdown */ }
|
||
|
|
}
|
||
|
|
|
||
|
|
_logger.LogInformation("SignalProcessBackgroundService 종료");
|
||
|
|
}
|
||
|
|
}
|