2

我需要从(后台)线程上的列表中读取,而它可能会从另一个(主线程)更新。因此,我尝试仅制作一个临时列表以不访问原始对象。由于更新可能发生在多个位置,因此将 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 和长度,以及数组的下限。

4

2 回答 2

1

经过审查.ToList,因此New List(Of SomeClass)(.),在 Reflector 中,异常必须来自刚刚设置为的is2.CopyTo(Me._items, 0)位置。Me._itemsNew T(count - 1) {}

这意味着输入集合中的项目数(转换为ICollection(Of T)in )在检索is2后必须增加。is2.Count

因此,我在现在已删除的答案中重新提出假设:主线程中的所有位置是否' ..edit list也在SyncLock SomeList修改列表时使用?

于 2012-07-28T13:25:27.787 回答
0

不确定VB中的等价物是什么,但你不能做这样的事情吗?

IList<string> roDinosaurs = dinosaurs.AsReadOnly();

或者

tempList.AddRange(SomeList);
于 2012-07-25T08:33:28.667 回答