使用SyncLock同步对List(T)的访问

Ach*_*les 0 .net vb.net multithreading locking synclock

我有一个类,其中包含多线程应用程序中使用的List(of T).我有三种方法Get,Add和Remove这些访问和修改List(of T).每当我查询所需对象以及添加或删除对象时,我都在使用SyncLock来锁定m_List. 但是,当我添加一个对象或删除一个对象而不是在我搜索所需的对象时,我只是想通过简单地锁定m_List来获得性能提升是多么奇怪?

Public Shared sub Add(SomeObject as object)

     SyncLock ctype(m_List, IList).SyncRoot

         m_List.add(SomeObject)

     end SyncLock

end sub

Public Shared sub Remove(SearchString as string)

     SyncLock ctype(m_List, IList).SyncRoot

           m_List.RemoveAll(function(o as SomeObject) o.SomeProperty = SearchString)

     end SyncLock
end Function

Public Shared Function Get(SearchString as string) as SomeObject
     'The Commented out code is what I am thinking of removing...
     'SyncLock ctype(m_List, IList).SyncRoot

     Dim FoundObjectList = m_List.where(function(o as SomeObject) o.SomeProperty = SearchString)

    if FoundObjectList.count > 0 then 

       If FoundObjectList(0).CreateDate < Now.AddMinutes(5) then
          Remove(FoundObjectList(0).SomeProperty)
          Return nothing
       end if
    else
         Return FoundObjectList(0)

    End if

   Return Nothing
'end SyncLock
end sub
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 6

如果你尝试遍历列表并允许另一个线程在你这样做的时候添加一个条目,你就会得到一个InvalidOperationException,就这么简单.我的猜测是,这不是你想要的行为.

List<T> 根本不支持从一个线程写入并同时从另一个线程读取 - 特别是不迭代列表.

  • @Achilles:要么在整个迭代时间内锁定它,要么在锁中复制并遍历副本. (2认同)