private async Task SendAllInternalAsync(long maxSize, int maxRetry) { _loggerService.StartMethod(); try { List <EventLog> eventLogList = await _eventLogRepository.GetLogsAsync(maxSize); if (eventLogList.Count == 0) { _loggerService.Info($"Event-logs not found."); return; } IDictionary <string, SendEventLogState> eventStateDict = new Dictionary <string, SendEventLogState>(); foreach (var eventType in EventType.All) { eventStateDict[eventType.ToString()] = _sendEventLogStateRepository.GetSendEventLogState(eventType); } foreach (var eventLog in eventLogList) { if (eventStateDict[eventLog.GetEventType()] != SendEventLogState.Enable) { eventLog.HasConsent = false; } } string idempotencyKey = Guid.NewGuid().ToString(); List <EventLog> agreedEventLogList = eventLogList.Where(eventLog => eventLog.HasConsent).ToList(); if (agreedEventLogList.Count == 0) { _loggerService.Info($"Agreed event-logs not found."); return; } PolicyResult <bool> policyResult = await Policy .HandleResult <bool>(result => !result) .WaitAndRetryAsync(maxRetry, retryAttempt => { double delay = Math.Pow(2, retryAttempt - 1); _loggerService.Warning($"Event log send failed. retryAttempt:{retryAttempt} delay:{delay}sec"); return(TimeSpan.FromSeconds(delay)); }) .ExecuteAndCaptureAsync(() => SendAsync(idempotencyKey, agreedEventLogList)); if (policyResult.Outcome == OutcomeType.Failure) { _loggerService.Error("Event log send failed all."); return; } _loggerService.Info($"Event log send successful."); _loggerService.Info($"Clean up..."); foreach (var eventLog in eventLogList) { await _eventLogRepository.RemoveAsync(eventLog); } _loggerService.Info($"Done."); } finally { _loggerService.EndMethod(); } }