我正在使用以下服务方法来缓存查询结果:
private readonly CoreDbContext _dbContext;
public EcommerceProductService()
{
_dbContext = GetDbContext();
}
public IEnumerable<EcommerceProduct> GetAllCached()
{
var cachedResult = HttpContext.Current.Cache["EcommerceProductService.GetAllCached"] as IEnumerable<EcommerceProduct>;
if (cachedResult == null)
{
var result = _dbContext.EcommerceProducts.ToList();
HttpContext.Current.Cache.Insert("EcommerceProductService.GetAllCached", result);
return result;
}
return cachedResult;
}
在某个页面中,该方法被 2 个线程同时调用(因为我需要将整个产品集合显示两次,但使用不同的过滤器)。
奇怪的是,我第一次启动应用程序时,只有一个线程“获胜”并接收产品列表,而另一个接收 null。如果我刷新页面,它们都开始正常工作(因为此时它们从缓存中获取结果),但第一次它只是一个或另一个,它们永远不会同时工作。
我还尝试将整个代码包装在 Lock 语句中,但它并没有改变任何事情。我错过了什么?
private readonly CoreDbContext _dbContext;
private static readonly object Locker = new object();
public EcommerceProductService()
{
_dbContext = GetDbContext();
}
public IEnumerable<EcommerceProduct> GetAllCached()
{
lock (Locker)
{
var cachedResult = HttpContext.Current.Cache["EcommerceProductService.GetAllCached"] as IEnumerable<EcommerceProduct>;
if (cachedResult == null)
{
var result = _dbContext.EcommerceProducts.ToList();
HttpContext.Current.Cache.Insert("EcommerceProductService.GetAllCached", result);
return result;
}
return cachedResult;
}
}