Использование SyncLock для синхронизации доступа к списку (из T) - PullRequest
0 голосов
/ 16 ноября 2010

У меня есть класс, который содержит список (из T), используемый в многопоточном приложении. У меня есть три метода Get, Add и Remove, где эти доступ и изменить список (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

1 Ответ

6 голосов
/ 16 ноября 2010

Если вы попытаетесь перебрать список и позволить другому потоку добавить запись, пока вы это делаете, вы получите InvalidOperationException, это так просто.Я предполагаю, что это не то поведение, которое вам нужно.

List<T> просто не поддерживает запись из одного потока и чтение из другого одновременно - особенно без перебора списка.

...