我需要从(背景)线程上的列表中读取,而它可以从另一个(主线程)更新。所以我试着制作一个临时列表,不要访问原始对象。由于更新可能发生在多个位置,因此将SyncLock放置在读取逻辑上会很方便。那天生就错了吗?我有什么选择正确地锁定它,或者在多线程条件下获取列表的可访问副本的其他方法?
' In Main thread:
Public SomeList = New List(Of SomeClass)
' ..edit list
' In other thread:
Dim tempList As List(Of SomeClass)
SyncLock SomeList
tempList = SomeList.ToList
End SyncLock
SomeList.ToList 抛出:
ArgumentException,目标数组不够长。校验 destIndex和length,以及数组的下限。
答案 0 :(得分:1)
在Reflector中审核.ToList
并因此审核New List(Of SomeClass)(.)
后,例外情况必须来自is2.CopyTo(Me._items, 0)
,其中Me._items
刚刚设置为New T(count - 1) {}
。< / p>
这意味着在检索到ICollection(Of T)
后,输入集合中的项目数(强制转换为is2
中的is2.Count
)必须增加。
因此,我在我现在删除的答案中重新提出这个假设:在' ..edit list
中,主线程中的所有位置在修改列表时也使用SyncLock SomeList
吗?
答案 1 :(得分:0)
不确定VB中的等价物是什么,但你不能做这样的事情吗?
IList<string> roDinosaurs = dinosaurs.AsReadOnly();
或者
tempList.AddRange(SomeList);