某个类已经单例是缓存的操作类用户 对于同一个缓存的KEY值的设置和删除 要有顺序 。不然会出问题。这个时候要怎么控制啊?= =详细点,新手请见谅= =

解决方案 »

  1.   

    还真不是一两句 能说清楚的给你两个链接 自己看下http://timyang.net/programming/memcache-mutex/
      

  2.   

    http://www.cnblogs.com/daizhj/articles/1959704.html
      

  3.   

    我用的是 System.Web.Caching.Cache.不考虑得太复杂 ,初步的用锁 实现 不同时 访问这两个 应该怎么样呢
      

  4.   

    应该是 不同时     对同一个KEY值 的赋值和删除     初步用锁怎么实现呢= =  你给我一下说太多 看不明白= =
      

  5.   

    用锁的话用
    Monitor.TryEnter()和
    Monitor.Exit()
    不要用lock
    http://msdn.microsoft.com/en-us/library/4tssbxcw.aspx
      

  6.   


    我要怎么判断 他们调用的是不是同一个KEY呢= =定义一个全局的变量来存储么如果是同一个 然后再看之前声明的锁开了没 这样么?
    这个是最好的方法吗 从性能上来讲
      

  7.   

    不用判断是否是同一个key 锁 要控制的就是 key 所对应的对象这样相同key 只会有一个被访问用Monitor.TryEnter 可避免死锁 
      

  8.   

    方法1(
          if (Monitor.TryEnter(OBJ))
          {
             try
             {
                这里可以对OBJ进行操作吗?
             }
             finally
             {
                Monitor.Exit(OBJ);
             }

       )如果 不EXIT 方法中就不能对 OBJ操作了吧?那就要定义一个 方法1和方法2都能访问的变量来储存这个OBJ  吧?
      

  9.   

    Monitor.TryEnter的对象和你代码使用的对象没有任何关系,OBJ只是个标记。即使你Monitor.TryEnter(OBJ)了其他线程也一样可以访问OBJ。
    你的需求跟互斥没什么关系,对于同一个缓存的KEY值的设置和删除为什么要有顺序?
      

  10.   

    http://stackoverflow.com/questions/39112/what-is-the-best-way-to-lock-cache-in-asp-net
      

  11.   

    阿非 我大概看了下 他们是用LOCK诶= =  你看我下面这段Monitor能实现顺序吗?/// <summary>
            /// 设置当前应用程序指定CacheKey的Cache值
            /// </summary>
            public bool SetCache(string CacheKey, object obj)
            {
                if (Monitor.TryEnter(obj))
                {
                    try
                    {
                        HttpRuntime.Cache.Insert(CacheKey, obj);
                    }
                    catch (ArgumentNullException)
                    {
                        return false;
                    }
                    finally
                    {
                        Monitor.Exit(obj);
                    }
                    return true;
                }
                return false;
            }        /// <summary>
            /// 清除对应KEY值的Cache
            /// </summary>
            public bool RemoveCache(string CacheKey)
            {
                Object obj = GetCache(CacheKey);
                if (obj == null)
                {
                    return true;
                }
                else
                {
                    if (Monitor.TryEnter(obj))
                    {
                        try
                        {
                            HttpRuntime.Cache.Remove(CacheKey);;
                        }
                        catch (Exception)
                        {
                            return false;
                        }
                        finally
                        {
                            Monitor.Exit(obj);
                        }
                        return true;
                    }
                    return false;
                }
            }
      

  12.   

    cache里保存的结果就是最后的结果,不明白你说的要控制先后顺序是什么意思,即使你互斥了也没办法控制先后顺序吧?
      

  13.   

    有这么几个问题Monitor.TryEnter 要用重载方法 
    Monitor.TryEnter(obj,3000)//尝试3秒
    否则和用lock 是一样的,还会有锁等待
    具体用那个要看需求而定.你现在锁的对象粒度太大了, 所有cache的增加都回等待
      

  14.   

    所有都加锁是说  没有区分key ,这样不同 key 之间的操作都会锁等待.