Reputation: 38638
I'm developing an web app using asp.net mvc.
I have a List in Cache (List of product class of my model). So, I do CRUD operations on this cached list. I know that HttpContext.Current.Cache is typeSafe but the list no. I'd like to know, what is the best way to do my operations to be thread safe to avoid conflicts ?
My code are something like this:
public static class ProjectCached {
const string key = "ProductList";
// my cached list
public static IList<Product> Products {
get {
if (HttpContext.Current.Cache[key] == null) {
HttpContext.Current.Cache.Insert(key, /* get data from database */, ...);
}
return (List<Product>)HttpContext.Current.Cache[key];
}
}
// my methods (operations on cached list)
public static void Increase(long id) {
var item = Products.FirstOrDefault(x => x.Id == id);
if (item != null) {
item.Prince += 1;
item.LastUpdate = DateTime.Now;
}
}
public static void Remove(long id) {
var item = Products.FirstOrDefault(x => x.Id == id);
if (item != null) {
Products.Remove(item);
}
}
// others methods
}
I will have a lot of users writing on this cached list at the same time...
I know that I can to use "lock" keyword but where need I to put this ? On my object finded? on my list?
thanks
Upvotes: 0
Views: 614
Reputation: 5783
Consider using IDictionary instead of list, for example SortedList<TKey, TValue>
About safe-threading: You can look to using
lock
keyword
ReaderWriterLockSlim - to lock only when needed
ConcurrentDictionary<TKey, TValue> - if thread-safe implemented in it is enough for you.
UPD: ReaderWriterLockSlim
is much more advanced than simple lock
keyword. Using ReaderWriterLockSlim
allows many readers to get data simultaneously without locks. But when some thread tries to write data, all other threads will be locked for and reading and writing.
Upvotes: 1
Reputation: 6654
You have to lock it before searching for the item.
private Object syncObject = new Object();
public static void Increase(long id) {
lock(syncObject) {
...
}
}
public static void Remove(long id) {
lock(syncObject) {
...
}
}
Upvotes: 0