Parallel.Invoke在使用System.Runtime.Caching时与Cache管理冲突

时间:2017-05-29 06:32:02

标签: c# asp.net asp.net-mvc asp.net-mvc-4 caching

我在我的类中使用System.Runtime.Caching,但是当我使用该类为我的应用程序中的不同主数据列表生成不同的缓存时。 但是这些缓存对象在应用程序中出现故障,即第一个列表从缓存中获取第二个列表的数据。

public class MemoryCacher : CachingProviderBase,IGlobalCachingProvider
{
    protected MemoryCacher()
    {
    }

    public static MemoryCacher Instance
    {
        get
        {
            return Nested.instance;
        }
    }

    class Nested
    {
        // Explicit static constructor to tell C# compiler
        // not to mark type as beforefieldinit
        static Nested()
        {
        }
        internal static readonly MemoryCacher instance = new MemoryCacher();
    }

    public virtual new void AddItem(string key, object value)
    {
        base.AddItem(key, value);
    }

    public virtual object GetItem(string key)
    {
        return base.GetItem(key,false);//Remove default is true because it's Global Cache!
    }

    public virtual new object GetItem(string key, bool remove)
    {
        return base.GetItem(key, remove);
    }
} 

对于我的应用程序,使用上面的类我正在为从API调用生成的不同List项创建缓存。

我使用Parallel.Invoke()并行调用方法,

public ActionResult Index()
        {
            Parallel.Invoke(
            () => GetMasterClass1List(),
            () => GetMasterClass2List()
            );
            return View();
        }



 private List<MasterClass1> GetMasterClass1List()
    {
      RequestUri = "Home/MyApiMethod1";//For getting the MasterClass1 data
      if(MemoryCacher.Instance.GetItem("MasterClass1Cache") != null)
        objMasterClass1Result = (List<MasterClass1>)MemoryCacher.Instance.GetItem("MasterClass1Cache");
      else
        {
          HttpResponseMessage response = ConnectAPI(RequestUri);
          if (response.IsSuccessStatusCode)
             {
              objMasterClass1Result = response.Content.ReadAsAsync<List<MasterClass1>>().Result;
              MemoryCacher.Instance.AddItem("MasterClass1Cache", objMasterClass1Result );
             }
       }
             return objMasterClass1Result ;
  }

    private List<MasterClass2> GetMasterClass2List()
      {
        RequestUri = "Home/MyApiMethod2";//For getting the MasterClass2 data
        if (MemoryCacher.Instance.GetItem("MasterClass2Cache") != null)
           objMasterClass2Result = (List<MasterClass2>)MemoryCacher.Instance.GetItem("MasterClass2Cache");
           else
           {
            HttpResponseMessage response = ConnectAPI(RequestUri);
            if (response.IsSuccessStatusCode)
            {
              objMasterClass2Result = response.Content.ReadAsAsync<List<MasterClass2>>().Result;
              MemoryCacher.Instance.AddItem("MasterClass2Cache", objMasterClass2Result );
            }
         }
           return objMasterClass2Result ;
      }

所以在这里,objMasterClass1Result有与objMasterClass2Result相关的数据。

只有当我使用Parallel.invoke时才会出现此问题,但如果使用只是一个接一个地调用方法,则缓存工作绝对正常。

有人可以告诉我为什么会这样吗?

0 个答案:

没有答案