У меня есть следующий репозиторий с кэшемКак сделать кэш-хранилище поточно
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public string LastName { get; set; }
public DateTime DateOfBirth { get; set; }
}
public interface IUserRepository
{
User GetUser(int userId);
}
public class CacheObject
{
public int UserId { get; set; }
public User User { get; set; }
public DateTime CreationDate { get; set; }
}
public class CachedUserRepository : IUserRepository
{
private IUserRepository _userRepository;
private List<CacheObject> _cache = new List<CacheObject>();
private int _cacheDuration = 60;
public CachedUserRepository(IUserRepository userRepository)
{
_userRepository = userRepository;
}
public User GetUser(int userId)
{
bool addToCache = false;
CacheObject valueFromCache = _cache.SingleOrDefault(u => u.UserId == userId);
// user was found
if (valueFromCache != null)
{
// if cache is outdated then remove value from it
if (valueFromCache.CreationDate.AddSeconds(_cacheDuration) < DateTime.Now)
{
_cache.Remove(valueFromCache);
addToCache = true;
}
else {
// update cache date
valueFromCache.CreationDate = DateTime.Now;
return valueFromCache.User;
}
}
// user is absent in cache
else {
addToCache = true;
}
if (addToCache)
{
User result = _userRepository.GetUser(userId);
_cache.Add(new CacheObject() { User = result, UserId = userId, CreationDate = DateTime.Now });
return result;
}
return null;
}
}
Я хотел бы запустить метод GetUser() в разных потоках, поэтому мне нужно, чтобы сделать этот метод поточно.
Как я могу это сделать?
Я не вижу никакого изящного решения, только lock (someObject) для всего тела метода. Но в результате я не добьюсь никакого прироста производительности
Не можете ли вы использовать кеш .Net framework? https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx Он полностью потокобезопасен. См. Http://blog.falafel.com/working-system-runtime-caching-memorycache/ для примера –
@PeterBons MemoryCache, конечно, может использоваться вместо моего индивидуального подхода со списком и CreationDate. Но некоторые блокировки по-прежнему необходимы. – Disappointed
Является ли ваш репозиторий самонезависимым? Если нет, то мне кажется бессмысленным. – Maarten