代码之家  ›  专栏  ›  技术社区  ›  Graviton

iList的SyncRoot

  •  0
  • Graviton  · 技术社区  · 15 年前

    我的代码是旧代码,它使用 ArrayList 存储集合元素。我用 m_objects.SyncRoot 对于 locking purpose before delete the object :

            lock(m_objects.SyncRoot) 
            {
                m_objects.Remove(obj);
    
            }
    

    现在的问题是,我现在想更改 m_objects 数组列表 List<T> 我遇到了上述代码的问题。相当于什么 列表& T; SyncRoot
    ?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Adriaan Stander    15 年前

    我想这可能是你要找的

    List<string> list = new List<string>();
    lock (((IList)list).SyncRoot)
    {
    }
    

    发现于 C# Generics Recipes—Replacing the ArrayList with Its Generic Counterpart

        2
  •  1
  •   Ignacio Soler Garcia    15 年前

    据我所知,syncroot只是一个用来锁定的对象。它的存在只是为了防止您创建要锁定的对象。所以必须做同样的事

    Object m_objectsLock = new Object();
    
    lock(m_objectsLock) 
    {
        m_objects.Remove(obj);
    
    }
    

    您必须确保在使用syncroot的任何地方都使用m_objectslock。

        3
  •  0
  •   Benjamin Podszun    15 年前

    据我所知 SyncRoot 这个概念已经过时了,而且也没怎么用。 大多数人都是 lock(){} 代替块。

    public class SomeClass {
      private readonly object listLock = new object();
      private readonly List<string> yourList = new List<string>();
    
      public void DeleteItem(string item) {
        lock (listLock) {
          yourList.Remove(item)
        }
      }
    }