Bur*_*ICA 14 c# service multithreading caching thread-safety
我Cache在这样的Web服务方法中使用:
var pblDataList = (List<blabla>)HttpContext.Current.Cache.Get("pblDataList");
if (pblDataList == null)
{
var PBLData = dc.ExecuteQuery<blabla>(@"SELECT blabla");
pblDataList = PBLData.ToList();
HttpContext.Current.Cache.Add("pblDataList", pblDataList, null,
DateTime.Now.Add(new TimeSpan(0, 0, 15)),
Cache.NoSlidingExpiration, CacheItemPriority.Normal, null);
}
Run Code Online (Sandbox Code Playgroud)
但我想知道,这段代码是否是线程安全的?Web服务方法由多个请求者调用.多个请求者可能会尝试检索数据并Cache在缓存为空时同时添加到数据中.
查询需要5到8秒.是否会围绕此代码引入锁定语句以防止任何可能的冲突?(我知道多个查询可以同时运行,但我想确保一次只运行一个查询.)
Aar*_*ght 22
缓存对象是线程安全的,但HttpContext.Current不能从后台线程获得. 这可能适用于您,也可能不适用于您,从您的代码段开始,您是否实际使用后台线程并不明显,但如果您现在或将来某个时候决定,您应该记住这一点.
如果您有可能需要从后台线程访问缓存,请改用HttpRuntime.Cache.
此外,虽然缓存上的单个操作是线程安全的,但顺序查找/存储操作显然不是原子操作.您是否需要它们是原子的取决于您的特定应用.如果同一个查询多次运行可能是一个严重的问题,即它是否会产生比数据库能够处理的更多的负载,或者如果请求返回的数据立即被覆盖,则会出现问题缓存,那么你可能想要锁定整个代码块.
但是,在大多数情况下,您真的想首先分析并查看这是否真的是一个问题.大多数Web应用程序/服务都不关心缓存的这一方面,因为它们是无状态的,如果缓存被覆盖则无关紧要.