コード例 #1
0
        protected virtual Guid ProfileStart(string id, string directory)
        {
            if (mResourceConsumer == null)
            {
                return(Guid.NewGuid());
            }

            return(mResourceConsumer.Start(string.Format("{0}/{1}", directory, id), Guid.NewGuid()));
        }
コード例 #2
0
 /// <summary>
 /// This method starts the profile session and returns the profile trace id.
 /// </summary>
 /// <param name="id">The trace id.</param>
 /// <returns>Returns a profile Guid.</returns>
 protected Guid ProfileStart(string id)
 {
     return(mResourceConsumer?.Start(id, Guid.NewGuid()) ?? Guid.NewGuid());
 }
コード例 #3
0
        /// <summary>
        /// This method retrieves the cache holder from the store. If the cache holder is not present then it
        /// tries to retrieve it from the underlying store.
        /// </summary>
        /// <param name="key">The key to retrieve.</param>
        /// <returns>The cache holder.</returns>
        protected async Task <EntityCacheHolder <K, E> > TryGetCacheHolder(K key)
        {
            var traceId = mResourceConsumer.Start("TryGetCacheHolder", Guid.NewGuid());
            ResourceRequestResult    status = ResourceRequestResult.Unknown;
            EntityCacheHolder <K, E> cacheHolder;
            int start = StatisticsInternal.ActiveIncrement();

            try
            {
                while (true)
                {
                    int retryStart = Environment.TickCount;

                    //Get the cache holder, and if it already exists, see if you need to wait.
                    if (!mEntities.TryGetValue(key, out cacheHolder))
                    {
                        var temp = new EntityCacheHolder <K, E>(key, Policy.EntityDefaultTTL);
                        if (mEntities.TryAdd(key, temp))
                        {
                            //Ok, the entity is not in the cache, so let's go and get the entity.
                            cacheHolder = temp;
                            break;
                        }
                    }
                    else
                    {
                        Gatekeeper(cacheHolder, traceId, out status);
                        return(cacheHolder);
                    }

                    mResourceConsumer.Retry(traceId, retryStart, ResourceRetryReason.Timeout);
                }

                try
                {
                    //Ok, read the entity
                    var result = await Read(key);

                    if (result != null && !result.IsFaulted && (result.ResponseCode == 200 || result.ResponseCode == 404))
                    {
                        cacheHolder.Load(result.Entity, result.ResponseCode);
                        status = ResourceRequestResult.Success;
                    }
                    else
                    {
                        cacheHolder.Cancel();
                        status = ResourceRequestResult.TaskCancelled;
                    }
                }
                catch (Exception ex)
                {
                    cacheHolder.Cancel();
                    status = ResourceRequestResult.TaskCancelled;
                    Collector?.LogException(string.Format("Error requesting {0} - {1} ", typeof(E).Name, key.ToString()), ex);
                }
                finally
                {
                    if (cacheHolder.State == EntityCacheHolderState.Cancelled)
                    {
                        mEntities.TryRemove(key, out cacheHolder);
                    }

                    //Make sure that any waiting requests are released.
                    cacheHolder.Release();
                }
            }
            finally
            {
                StatisticsInternal.ActiveDecrement(start);
                if (status != ResourceRequestResult.Success)
                {
                    StatisticsInternal.ErrorIncrement();
                }

                mResourceConsumer.End(traceId, start, status);
            }

            return(cacheHolder);
        }