多线程列表中的SyncLock仍会抛出ArgumentException

时间:2012-07-25 08:28:54

标签: .net vb.net multithreading locking synclock

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

2 个答案:

答案 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);
相关问题