我正在使用asp.net mvc开发一个Web应用程序。
我在Cache中有一个List(我的模型的产品类列表)。所以,我在这个缓存列表上做了CRUD操作。我知道HttpContext.Current.Cache是typeSafe但列表没有。我想知道,为避免冲突,我的操作最好的方法是线程安全吗?
我的代码是这样的:
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
}
我会有很多用户同时在这个缓存列表上写...
我知道我可以使用“锁定”关键字但是我需要把它放在哪里?在我的对象上找到了吗?在我的名单上?
感谢
答案 0 :(得分:1)
考虑使用IDictionary而不是list,例如SortedList<TKey, TValue>
关于安全线程:您可以使用
lock
关键字
ReaderWriterLockSlim - 仅在需要时锁定
ConcurrentDictionary<TKey, TValue> - 如果在其中实现了线程安全就足够了。
UPD:ReaderWriterLockSlim
比简单lock
关键字更先进。使用ReaderWriterLockSlim
允许许多读者在没有锁的情况下同时获取数据。但是当某个线程尝试写入数据时,所有其他线程都将被锁定并进行读写。
答案 1 :(得分:0)
您必须先锁定它才能搜索该项目。
private Object syncObject = new Object();
public static void Increase(long id) {
lock(syncObject) {
...
}
}
public static void Remove(long id) {
lock(syncObject) {
...
}
}