public Task<TimeoutsChunk> GetNextChunk(DateTime startSlice)
{
var now = currentTimeProvider();
var nextTimeToRunQuery = DateTime.MaxValue;
var dueTimeouts = new List<TimeoutsChunk.Timeout>();
try
{
readerWriterLock.EnterReadLock();
foreach (var data in storage)
{
if (data.Time > now && data.Time < nextTimeToRunQuery)
{
nextTimeToRunQuery = data.Time;
}
if (data.Time > startSlice && data.Time <= now)
{
dueTimeouts.Add(new TimeoutsChunk.Timeout(data.Id, data.Time));
}
}
}
finally
{
readerWriterLock.ExitReadLock();
}
if (nextTimeToRunQuery == DateTime.MaxValue)
{
nextTimeToRunQuery = now.Add(EmptyResultsNextTimeToRunQuerySpan);
}
return Task.FromResult(new TimeoutsChunk(dueTimeouts.ToArray(), nextTimeToRunQuery));
}