public List <GroupMembershipData> GetAgentGroupMemberships(string AgentID, GroupMembershipListDelegate d, bool forceUpdate) { object memberships = null; bool firstCall = false; string cacheKey = "memberships-" + AgentID.ToString(); //m_log.DebugFormat("[XXX]: GetAgentGroupMemberships {0}", cacheKey); while (true) { lock (m_Cache) { if (!forceUpdate && m_Cache.TryGetValue(cacheKey, out memberships)) { //m_log.DebugFormat("[XXX]: GetAgentGroupMemberships {0} cached!", cacheKey); return((List <GroupMembershipData>)memberships); } // not cached if (!m_ActiveRequests.ContainsKey(cacheKey)) { m_ActiveRequests.Add(cacheKey, true); firstCall = true; } } if (firstCall) { try { memberships = d(); lock (m_Cache) { m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT); return((List <GroupMembershipData>)memberships); } } finally { lock (m_Cache) { m_ActiveRequests.Remove(cacheKey); } } } else { Thread.Sleep(50); } } }
public List<GroupMembershipData> GetAgentGroupMemberships(string AgentID, GroupMembershipListDelegate d) { object memberships = null; bool firstCall = false; string cacheKey = "memberships-" + AgentID.ToString(); //m_log.DebugFormat("[XXX]: GetAgentGroupMemberships {0}", cacheKey); while (true) { lock (m_Cache) { if (m_Cache.TryGetValue(cacheKey, out memberships)) { //m_log.DebugFormat("[XXX]: GetAgentGroupMemberships {0} cached!", cacheKey); return (List<GroupMembershipData>)memberships; } // not cached if (!m_ActiveRequests.ContainsKey(cacheKey)) { m_ActiveRequests.Add(cacheKey, true); firstCall = true; } } if (firstCall) { try { memberships = d(); lock (m_Cache) { m_Cache.AddOrUpdate(cacheKey, memberships, GROUPS_CACHE_TIMEOUT); return (List<GroupMembershipData>)memberships; } } finally { m_ActiveRequests.Remove(cacheKey); } } else Thread.Sleep(50); } }