public IServiceResult GetORIsOfService(IServiceDescription serviceDescription, ExecuteServiceDelegate executeServiceDelegate) { if (!UseResultCache) { return(executeServiceDelegate.Invoke(serviceDescription)); } ServiceResultCacheKey key = BuildKey(serviceDescription); IServiceResult serviceResult; lock (serviceCallToPendingResult) { serviceResult = serviceCallToResult.Get(key); if (serviceResult != null) { return(CreateServiceResult(serviceResult)); } while (serviceCallToPendingResult.Contains(key)) { Monitor.Wait(serviceCallToPendingResult); } serviceResult = serviceCallToResult.Get(key); if (serviceResult != null) { return(CreateServiceResult(serviceResult)); } serviceCallToPendingResult.Add(key); } bool success = false; try { if (SecurityActivation != null) { serviceResult = SecurityActivation.ExecuteWithoutFiltering(new IResultingBackgroundWorkerDelegate <IServiceResult>(delegate() { return(executeServiceDelegate.Invoke(serviceDescription)); })); } else { serviceResult = executeServiceDelegate.Invoke(serviceDescription); } success = true; } finally { lock (serviceCallToPendingResult) { serviceCallToPendingResult.Remove(key); if (success) { serviceCallToResult.Put(key, serviceResult); } Monitor.PulseAll(serviceCallToPendingResult); } } return(CreateServiceResult(serviceResult)); }
public IList <IObjRelationResult> GetObjRelations(IList <IObjRelation> objRels, ICacheIntern targetCache, CacheDirective cacheDirective) { CheckNotDisposed(); IEventQueue eventQueue = EventQueue; if (eventQueue != null) { eventQueue.Pause(this); } try { bool oldCacheModificationValue = CacheModification.Active; bool acquireSuccess = AcquireHardRefTLIfNotAlready(objRels.Count); CacheModification.Active = true; try { if (SecurityActive && ((targetCache == null && Privileged) || (targetCache != null && targetCache.Privileged) && // SecurityActivation != null && SecurityActivation.FilterActivated)) { return(SecurityActivation.ExecuteWithoutFiltering(delegate() { return Parent.GetObjRelations(objRels, targetCache, cacheDirective); })); } else { return(Parent.GetObjRelations(objRels, targetCache, cacheDirective)); } } finally { CacheModification.Active = oldCacheModificationValue; ClearHardRefs(acquireSuccess); } } finally { if (eventQueue != null) { eventQueue.Resume(this); } } }