0

我正在使用以下服务方法来缓存查询结果:

    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;
        }

    }
4

1 回答 1

0

_locker将您的声明更改为

private static object _locker = new object();

正如您现在所拥有的,每个实例都EcommerceProductService为其分配一个新值,从而使锁定变得无用。

于 2016-05-21T11:14:52.283 回答