예제 #1
0
        public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
        {
#if Webhosted
            Cache cache = GetCache();
#else
            ObjectCache cache = this.GetCache();
#endif
            string cacheKey = this.CreateCacheKey(inputs);
            CachedResult cacheItem = cache[cacheKey] as CachedResult;
            CachingUserState cachingUserState = new CachingUserState
            {
                CacheItem = cacheItem,
                CacheKey = cacheKey,
                OriginalUserCallback = callback,
                OriginalUserState = state
            };

            IAsyncResult originalAsyncResult;
            if (cacheItem != null)
            {
                InvokerDelegate invoker = cacheItem.GetValue;
                object[] dummy;
                originalAsyncResult = invoker.BeginInvoke(inputs, out dummy, this.InvokerCallback, cachingUserState);
            }
            else
            {
                originalAsyncResult = this.originalInvoker.InvokeBegin(instance, inputs, this.InvokerCallback, cachingUserState);
            }

            return new CachingAsyncResult(originalAsyncResult, cachingUserState);
        }
        public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
        {
            string cacheKey = WebOperationContext.Current.IncomingRequest.UriTemplateMatch.RequestUri.ToString();
            CachedResult cacheResult = this.datacache.Get(cacheKey) as CachedResult;
            CachingUserState cachingUserState = new CachingUserState
            {
                CacheItem = cacheResult,
                CacheKey = cacheKey,
                OriginalUserCallback = callback,
                OriginalUserState = state
            };
            IAsyncResult asyncResult;
            if (cacheResult != null)
            {
                InvokerDelegate invoker = cacheResult.GetValue;
                object[] outputs;
                asyncResult = invoker.BeginInvoke(inputs, out outputs, this.InvokerCallback, cachingUserState);
            }
            else
            {
                asyncResult = this.operationInvoker.InvokeBegin(instance, inputs, this.InvokerCallback, cachingUserState);
            }

            return new CachingAsyncResult(asyncResult, cachingUserState);
        }
        public object InvokeEnd(object instance, out object[] outputs, IAsyncResult asyncResult)
        {
            CachingAsyncResult cachingAsyncResult = asyncResult as CachingAsyncResult;
            CachingUserState   cachingUserState   = cachingAsyncResult.CachingUserState;

            if (cachingUserState.CacheItem == null)
            {
                object result = this.originalInvoker.InvokeEnd(instance, out outputs, cachingAsyncResult.OriginalAsyncResult);
                cachingUserState.CacheItem = new CachedResult {
                    ReturnValue = result, Outputs = outputs
                };
#if Webhosted
                this.GetCache().Insert(cachingUserState.CacheKey, cachingUserState.CacheItem, null, Cache.NoAbsoluteExpiration, TimeSpan.FromSeconds(this.cacheDuration));
#else
                this.GetCache().Add(cachingUserState.CacheKey, cachingUserState.CacheItem, DateTimeOffset.UtcNow.Add(TimeSpan.FromSeconds(this.cacheDuration)));
#endif
                return(result);
            }
            else
            {
                InvokerDelegate invoker = ((System.Runtime.Remoting.Messaging.AsyncResult)cachingAsyncResult.OriginalAsyncResult).AsyncDelegate as InvokerDelegate;
                invoker.EndInvoke(out outputs, cachingAsyncResult.OriginalAsyncResult);
                return(cachingUserState.CacheItem.ReturnValue);
            }
        }
        public IAsyncResult InvokeBegin(object instance, object[] inputs, AsyncCallback callback, object state)
        {
#if Webhosted
            Cache cache = GetCache();
#else
            ObjectCache cache = this.GetCache();
#endif
            string           cacheKey         = this.CreateCacheKey(inputs);
            CachedResult     cacheItem        = cache[cacheKey] as CachedResult;
            CachingUserState cachingUserState = new CachingUserState
            {
                CacheItem            = cacheItem,
                CacheKey             = cacheKey,
                OriginalUserCallback = callback,
                OriginalUserState    = state
            };

            IAsyncResult originalAsyncResult;
            if (cacheItem != null)
            {
                InvokerDelegate invoker = cacheItem.GetValue;
                object[]        dummy;
                originalAsyncResult = invoker.BeginInvoke(inputs, out dummy, this.InvokerCallback, cachingUserState);
            }
            else
            {
                originalAsyncResult = this.originalInvoker.InvokeBegin(instance, inputs, this.InvokerCallback, cachingUserState);
            }

            return(new CachingAsyncResult(originalAsyncResult, cachingUserState));
        }
예제 #5
0
 public CachingAsyncResult(IAsyncResult originalResult, CachingUserState cachingUserState)
 {
     this.originalResult = originalResult;
     this.cachingUserState = cachingUserState;
 }
 public CachingAsyncResult(IAsyncResult asyncResult, CachingUserState cachingUserState)
 {
     this.asyncResult = asyncResult;
     this.cachingUserState = cachingUserState;
 }
 public CachingAsyncResult(IAsyncResult originalResult, CachingUserState cachingUserState)
 {
     this.originalResult   = originalResult;
     this.cachingUserState = cachingUserState;
 }
        private void InvokerCallback(IAsyncResult asyncResult)
        {
            CachingUserState cachingUserState = asyncResult.AsyncState as CachingUserState;

            cachingUserState.OriginalUserCallback(new CachingAsyncResult(asyncResult, cachingUserState));
        }