// ReSharper disable once SuggestBaseTypeForParameter public void ReportTimeIntervals(DateTime now, IntervalsBreakdown item) { var currentEpoch = GetEpoch(now.Ticks); var intervalsToFill = item.Intervals; var numberOfIntervalsToFill = intervalsToFill.Length; var totalDuration = 0L; var totalMeasurements = 0; rwl.EnterReadLock(); try { var epoch = currentEpoch - delayedIntervals; for (var i = 0; i < numberOfIntervalsToFill; i++) { var epochIndex = epoch % size; var interval = intervals[epochIndex]; intervalsToFill[i] = new TimeInterval { IntervalStart = GetDateTime(epoch) }; // the interval might contain data from the right epoch, or epochs before that have the same index // we calculate data only if that's the right epoch if (interval.Epoch == epoch) { intervalsToFill[i].TotalValue = interval.TotalTime; intervalsToFill[i].TotalMeasurements = interval.TotalMeasurements; totalDuration += interval.TotalTime; totalMeasurements += interval.TotalMeasurements; } epoch -= 1; } } finally { rwl.ExitReadLock(); } item.TotalValue = totalDuration; item.TotalMeasurements = totalMeasurements; }
public IntervalsBreakdown[] GetIntervals(DateTime now) { var result = new List <IntervalsBreakdown>(); foreach (var interval in intervals) { var breakdownId = interval.Key; var measurement = interval.Value; var item = new IntervalsBreakdown { Id = breakdownId, Intervals = new TimeInterval[numberOfIntervals] }; measurement.ReportTimeIntervals(now, item); result.Add(item); } return(result.ToArray()); }