我需要从(背景)线程上的列表中读取,同时可以从另一个线程(主线程)中更新它。因此,我尝试做一个临时列表,不访问原始对象。由于更新可能发生在多个地方,所以将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 SyncLockSomeList.ToList抛出:
ArgumentException,目标数组不够长。检查destIndex和length以及数组的下界。
发布于 2012-07-28 13:25:27
在查看.ToList和New List(Of SomeClass)(.)之后,在Reflector中,异常必须来自刚刚将Me._items设置为New T(count - 1) {}的is2.CopyTo(Me._items, 0)。
这意味着输入集合中的项数(在is2中转换为is2)必须在检索is2.Count之后增加。
因此,我再次问我现在删除的答案中的假设:在' ..edit list中,主线程中的所有位置都在修改列表时也使用SyncLock SomeList吗?
发布于 2012-07-25 08:33:28
不知道VB中的等价物是什么,但你不能这样做吗?
IList<string> roDinosaurs = dinosaurs.AsReadOnly();或
tempList.AddRange(SomeList);https://stackoverflow.com/questions/11645613
复制相似问题