Использование SyncLock для синхронизации доступа к списку (из T)
У меня есть класс, который содержит список (из 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 ответ
Если вы попытаетесь перебрать список и позволить другому потоку добавить запись, пока вы это делаете, вы получите InvalidOperationException
Это так просто. Я думаю, это не то поведение, которое вы хотите.
List<T>
просто не поддерживает запись из одного потока и чтение из другого одновременно - особенно без перебора списка.