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 に答える