1.Данные
Наличие двух словарей означает, что теперь вы должны действительно синхронизировать их, что частично отменит преимущества использования параллельного словаря.
Предлагаю хранить отметку в том же словаре.Один из способов сделать это:
class ToStore {
//Constructor here, or add public sets
public YourClass Data {get;}
public DateTime AddedAtUtc {get;}
//I would suggest using NodaTime's Instant, but that's out of scope for this question.
}
public void Add(YourClass data )
{
if (data == null)
{
throw new ArgumentNullException(nameof(data ));
}
var frame = new ToStore {
Data = data,
AddedUtc = DateTime.UtcNow
}
dict.TryAdd(frame.TimestampUtc, frame);
OnAdd(); // fire and forget
}
Если ключ может быть меткой времени, вам не нужен класс ToStore
, который сделает его еще проще.
2.Очистка
Я не знаю, ваше приложение, но вы можете рассмотреть возможность очистки при добавлении новых элементов, а не по таймеру.
public void Add(YourOtherClass data )
{
(...)
OnAdd(); // fire and forget
}
private void OnAdd()
{
Task.Run(() =>
{
CleanUp();
}).ConfigureAwait(false);
}
Cleanup
:
foreach (var kvp in dict.Where(IsStale))
{
// Please note that by now the frame may have been already
// removed by another thread.
dict.TryRemove(kvp.Key, out var ignored);
}
где IsStale
возвращает true, если кадр достаточно старый, чтобы его можно было удалить.
Надеюсь, это поможет.