What is the best way to lock cache in asp.net?

前端 未结 10 736
悲&欢浪女
悲&欢浪女 2020-11-27 09:33

I know in certain circumstances, such as long running processes, it is important to lock ASP.NET cache in order to avoid subsequent requests by another user for that resourc

10条回答
  •  鱼传尺愫
    2020-11-27 10:12

    I modified @user378380's code for more flexibility. Instead of returning TResult now returns object for accepting different types in order. Also adding some parameters for flexibility. All the idea belongs to @user378380.

     private static readonly object _lock = new object();
    
    
    //If getOnly is true, only get existing cache value, not updating it. If cache value is null then      set it first as running action method. So could return old value or action result value.
    //If getOnly is false, update the old value with action result. If cache value is null then      set it first as running action method. So always return action result value.
    //With oldValueReturned boolean we can cast returning object(if it is not null) appropriate type on main code.
    
    
     public static object GetOrAdd(this Cache cache, string key, Func action,
        DateTime absoluteExpireTime, TimeSpan slidingExpireTime, bool getOnly, out bool oldValueReturned)
    {
        object result;
        var data = cache[key]; 
    
        if (data == null)
        {
            lock (_lock)
            {
                data = cache[key];
    
                if (data == null)
                {
                    oldValueReturned = false;
                    result = action();
    
                    if (result == null)
                    {                       
                        return result;
                    }
    
                    cache.Insert(key, result, null, absoluteExpireTime, slidingExpireTime);
                }
                else
                {
                    if (getOnly)
                    {
                        oldValueReturned = true;
                        result = data;
                    }
                    else
                    {
                        oldValueReturned = false;
                        result = action();
                        if (result == null)
                        {                            
                            return result;
                        }
    
                        cache.Insert(key, result, null, absoluteExpireTime, slidingExpireTime);
                    }
                }
            }
        }
        else
        {
            if(getOnly)
            {
                oldValueReturned = true;
                result = data;
            }
            else
            {
                oldValueReturned = false;
                result = action();
                if (result == null)
                {
                    return result;
                }
    
                cache.Insert(key, result, null, absoluteExpireTime, slidingExpireTime);
            }            
        }
    
        return result;
    }
    

提交回复
热议问题