public async Task <ICacheEntry <T> > HitOrUpdateAsync(ulong id, Func <ulong, Task <IEntry <T> > > updater) { if (await _storage.HasAsync(id)) { var cached = await _storage.RestoreAsync(id); if (cached.CachedAt + _timeout > DateTimeOffset.Now) { return(cached); } } var entry = _entryFactory.Create((await updater(id)).Item); await _storage.StoreAsync(entry); return(entry); }