private void FlushInternal() { Interlocked.Exchange(ref _lastFlushTicks, DateTime.UtcNow.Ticks); var lastFailTicks = LastFailTicks; var lastFailTime = lastFailTicks == 0 ? (DateTime?)null : new DateTime(lastFailTicks, DateTimeKind.Utc); var change = new JobStatusUpdateData { LastIterationStartTime = new DateTime(LastIterationStartedTicks, DateTimeKind.Utc), LastDequeueAttemptTime = new DateTime(LastDequeueAttemptTicks, DateTimeKind.Utc), LastProcessStartTime = new DateTime(LastProcessStartedTicks, DateTimeKind.Utc), LastProcessFinishTime = new DateTime(LastProcessFinishedTicks, DateTimeKind.Utc), LastHealthCheckTime = new DateTime(LastHealthCheckTicks, DateTimeKind.Utc), ItemsProcessedDelta = Interlocked.Exchange(ref _unflushedItemsProcessed, 0L), ProcessingTimeTakenMillisDelta = Interlocked.Exchange(ref _unflushedProcessingTimeTakenMillis, 0L), ItemsRequeuedDelta = Interlocked.Exchange(ref _unflushedItemsRequeued, 0L), ItemsGeneratedForTargetQueueDelta = Interlocked.Exchange(ref _unflushedItemsGeneratedForTargetQueue, 0L), ItemsFailedDelta = Interlocked.Exchange(ref _unflushedItemsFailed, 0L), LastFailTime = lastFailTime }; if (!_unflushedProcessingErrorMessages.IsEmpty) { var faults = new List <JobStatusErrorData>(); while (_unflushedProcessingErrorMessages.TryDequeue(out var message)) { faults.Add(new JobStatusErrorData { ErrorMessage = message, Timestamp = DateTime.UtcNow.Ticks }); } if (faults.Count > 0) { change.LastFailures = faults.ToArray(); } } try { _jobStore.UpdateStatus(_tenantId, _jobId, change).GetAwaiter().GetResult(); } catch (Exception e) { Log.Error($"Job runner {_jobId} - Could not flush statistics due to exception", e); } }