【问题标题】:Using SyncLock to synchronize access to List(of T)使用 SyncLock 同步访问 List(of T)
【发布时间】:2010-11-16 17:50:12
【问题描述】:

我有一个包含多线程应用程序中使用的 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

【问题讨论】:

    标签: .net vb.net multithreading locking synclock


    【解决方案1】:

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

    List&lt;T&gt; 根本不支持同时从一个线程写入和从另一个线程读取 - 特别是不遍历列表。

    【讨论】:

    • 所以我认为我需要在迭代发生时锁定列表,即我对集合运行的任何 linq 查询?
    • @Achilles:要么在整个迭代时间内锁定它,要么在锁定中获取副本并迭代副本。
    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2010-10-22
    • 2019-11-21
    • 2021-05-25
    相关资源
    最近更新 更多