首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程列表中的SyncLock仍然抛出ArgumentException

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

Stack Overflow用户
提问于 2012-07-25 08:28:54
回答 2查看 397关注 0票数 2

我需要从(背景)线程上的列表中读取,同时可以从另一个线程(主线程)中更新它。因此,我尝试做一个临时列表,不访问原始对象。由于更新可能发生在多个地方,所以将SyncLock放在读取逻辑上是很方便的。这本质上是错的吗?在多线程条件下,我有哪些正确锁定列表的选项,或者获取列表的可访问副本的其他方法?

代码语言:javascript
复制
 ' 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以及数组的下界。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-28 13:25:27

在查看.ToListNew List(Of SomeClass)(.)之后,在Reflector中,异常必须来自刚刚将Me._items设置为New T(count - 1) {}is2.CopyTo(Me._items, 0)

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

因此,我再次问我现在删除的答案中的假设:在' ..edit list中,主线程中的所有位置都在修改列表时也使用SyncLock SomeList吗?

票数 1
EN

Stack Overflow用户

发布于 2012-07-25 08:33:28

不知道VB中的等价物是什么,但你不能这样做吗?

代码语言:javascript
复制
IList<string> roDinosaurs = dinosaurs.AsReadOnly();

代码语言:javascript
复制
tempList.AddRange(SomeList);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11645613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档