适用于IList的SyncRoot

时间:2009-12-29 06:49:47

标签: c# collections

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

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

        }

现在的问题是,我现在想要将m_objects的类型从ArrayList更改为List<T>,我遇到上述代码的问题。等同于List<T>的{​​{1}}

3 个答案:

答案 0 :(得分:5)

我认为这可能就是你要找的东西

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

找到C# Generics Recipes—Replacing the ArrayList with Its Generic Counterpart

答案 1 :(得分:1)

据我所知,SyncRoot只是一个用来锁定的对象。只是为了避免创建一个锁定对象。所以它必须是相同的

Object m_objectsLock = new Object();

lock(m_objectsLock) 
{
    m_objects.Remove(obj);

}

您必须确保在使用SyncRoot的任何地方使用m_objectsLock。

答案 2 :(得分:0)

据我所知,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)
    }
  }
}