Felipe Oriani
Felipe Oriani

Reputation: 38638

List<T> on Cache (Security Operations)

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

Answers (2)

The Smallest
The Smallest

Reputation: 5783

Consider using IDictionary instead of list, for example SortedList<TKey, TValue>
About safe-threading: You can look to using

  1. lock keyword

  2. ReaderWriterLockSlim - to lock only when needed

  3. 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

goenning
goenning

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

Related Questions