/// <summary>
        /// Gets the stored value associated with the specified key or store a new value
        /// generated by the provided factory function and return it.
        /// If the value factory function is called to create a new item, a lock is aquired to supress
        /// multiple call to the factory function for the specified key (calls to others keys are not blocked).
        /// If the lock times out (i.e. the factory takes more waitTimeout to create then new instance), the default value for the type is returned.
        /// </summary>
        /// <param name="key">The key.</param>
        /// <param name="valueFactory">The value factory function.</param>
        /// <param name="waitTimeoutMilliseconds">The wait timeout milliseconds.</param>
        /// <returns>Stored value for the key or default value if not found</returns>
        public static T GetOrSyncAdd(string key, Func <string, T> valueFactory, int waitTimeoutMilliseconds)
        {
            if (String.IsNullOrEmpty(key))
            {
                return(default(T));
            }
            CachedItem item;

            if (!m_cacheMap.TryGetValue(key, out item))
            {
                // create a lock for this key
                using (var padlock = new NamedLock(key))
                {
                    if (padlock.Enter(waitTimeoutMilliseconds))
                    {
                        return(GetOrAdd(key, valueFactory));
                    }
                    else
                    {
                        return(default(T));
                    }
                }
            }
            return(item.Data);
        }
예제 #2
0
        /// <summary>
        /// Creates a new instance and tries to aquire a lock.
        /// </summary>
        /// <param name="key">The named lock key.</param>
        /// <param name="waitTimeoutMilliseconds">The wait timeout milliseconds.</param>
        public static NamedLock CreateAndEnter(string key, int waitTimeoutMilliseconds)
        {
            NamedLock item;

            item = new NamedLock(key);
            item.Enter(waitTimeoutMilliseconds);
            return(item);
        }
예제 #3
0
        /// <summary>
        /// Creates a new instance and tries to aquire a lock.
        /// </summary>
        /// <param name="key">The named lock key.</param>
        public static NamedLock CreateAndEnter(string key)
        {
            NamedLock item;

            item = new NamedLock(key);
            item.Enter();
            return(item);
        }