3

我在名为helper.getdiscount(). 此类是 ASP.NET 前端代码,由 UI 页面使用。

在这个方法中,我检查一些数据是否在 ASP.NET 缓存中,然后返回它,否则它会进行服务调用并将结果存储在缓存中,然后返回该值。

考虑到多个线程可能同时访问它,这会是一个问题吗?

if (HttpContext.Current.Cache["GenRebateDiscountPercentage"] == null)
{ 
    IShoppingService service = ServiceFactory.Instance.GetService<IShoppingService>();
    rebateDiscountPercentage= service.GetGenRebateDiscountPercentage().Result;


    if (rebateDiscountPercentage > 0)
    {
        HttpContext.Current.Cache.Add("GenRebateDiscountPercentage", rebateDiscountPercentage, null, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
    }
}
else
{      
    decimal.TryParse(HttpContext.Current.Cache["GenRebateDiscountPercentage"].ToString(), out rebateDiscountPercentage);
}

请告知这是否可以或可以使用任何更好的方法。

4

2 回答 2

0

用锁定对象尝试这样的事情。

static readonly object objectToBeLocked= new object();

        lock( objectToBeLocked)
        { 
             if (HttpContext.Current.Cache["GenRebateDiscountPercentage"] == null)
            { 
                IShoppingService service = ServiceFactory.Instance.GetService<IShoppingService>();
                rebateDiscountPercentage= service.GetGenRebateDiscountPercentage().Result;


                if (rebateDiscountPercentage > 0)
                {
                    HttpContext.Current.Cache.Add("GenRebateDiscountPercentage", rebateDiscountPercentage, null, DateTime.Now.AddDays(1), System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.Normal, null);
                }
            }
            else
            {      
                decimal.TryParse(HttpContext.Current.Cache["GenRebateDiscountPercentage"].ToString(), out rebateDiscountPercentage);
            }
        }

您也可以查看以下线程。

在 asp.net 中锁定缓存的最佳方法是什么?

于 2013-06-11T13:02:47.417 回答
0

使用这些通用方法将缓存用于任何类型:

`public static void AddCache(string key, object Data, int minutesToLive = 1440)
{
    if (Data == null)
        return;
    HttpContext.Current.Cache.Insert(key, Data, null, DateTime.Now.AddMinutes(minutesToLive), Cache.NoSlidingExpiration);
}

public static T GetCache<T>(string key)
{
    return (T)HttpContext.Current.Cache.Get(key);
} `

现在解决您的问题:

`if(GetCache<decimal>("GenRebateDiscountPercentage") == null)
{ 

   IShoppingService service = ServiceFactory.Instance.GetService<IShoppingService>();
   rebateDiscountPercentage= service.GetGenRebateDiscountPercentage().Result;


   if (rebateDiscountPercentage > 0)
   {
       AddCache("GetGenRebateDiscountPercentage", rebateDiscountPercentage);
   }
}
else
{
    rebateDiscountPercentage = GetCache<decimal>("GetGenRebateDiscountPercentage");
}

`

于 2017-05-02T00:54:01.433 回答