Ich habe das folgendes Repository mit CacheWie Cache-Repository Thread-sicher
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;
}
}
Ich möchte laufen Methode GetUser() in verschiedenen Threads machen, so dass ich diese Methode Thread-sicher machen müssen.
Wie kann ich es schaffen?
Ich sehe keine elegante Lösung, nur Sperre (someObject) auf den gesamten Körper der Methode. Aber als Ergebnis werde ich keine Leistungssteigerung erzielen
Kannst du nicht den .Net Framework bereitgestellten Cache verwenden? https://msdn.microsoft.com/en-us/library/system.runtime.caching.memorycache(v=vs.110).aspx Es ist völlig threadsicher. Ein Beispiel finden Sie unter http://blog.falafel.com/working-system-runtime-caching-memorycache/ –
@PeterBons MemoryCache kann natürlich anstelle meiner benutzerdefinierten Ansatz mit List und CreationDate verwendet werden. Aber einige Sperren sind noch erforderlich. – Disappointed
Ist Ihr Repository selbst Thread-sicher? Wenn nicht, dann erscheint es mir sinnlos. – Maarten