开发者

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


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.


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) {
        ...    
    }
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜