目标阵列不够长?

Gee*_*ert 47 c# locking list

我有一个类有以下方法:

public List<Bike> bikesCopy 
{
     get 
     { 
       List<Bike> bs;
       lock (_bikes) bs = new List<Bike>(_bikes);
       return bs;
     }
}
Run Code Online (Sandbox Code Playgroud)

这是另一个列表的副本, private List<Bike> _bikes;

现在奇怪的是,我收到以下错误:

目标数组不够长.检查destIndex和length,以及数组的下限.

这里有什么问题?

Wol*_*lf5 87

我会说错误在于对象_bikes不是线程安全的.如评论所述,某处有一个未被锁定的_bikes对象的修改.

这是一个瞬间错误,当测量_bikes的大小时,变量bs设置为大小X. 在将要填充列表的下一个瞬间,_bikes对象的大小增加,从而产生错误.

所以仔细阅读你的代码.查找_bikes对象的所有引用,并确保它们是线程安全处理(带锁).

  • 那没问题。最糟糕的是当你被否决并且不知道为什么时。 (3认同)

edv*_*dig 7

那么你可以尝试:

using System.Linq; //ToList() is an extension function defined here
...
lock(_bikes)
    return _bikes.ToList();
Run Code Online (Sandbox Code Playgroud)

这里讨论了异常的细节:为什么foreach循环在某些情况下不起作用?

  • 你不能使用LINQ?!?!?一发现,我就放弃了这份工作! (14认同)

Kus*_*ver 5

出现此错误是因为多个线程在单个列表中添加项目。默认情况下,列表不是线程安全的解决方案。在多线程代码中,建议只从列表中读取,而不是写入。

如上所述这里

如果您只是从共享集合中读取数据,则可以使用 System.Collections.Generic 命名空间中的类。

更好地使用线程安全的解决方案,如System.Collections.Concurrent命名空间,它提供了ConcurrentBagConcurrentDictionaryConcurrentQueueConcurrentStack等实现。

例如:

public ConcurrentBag<Bike> bikesCopy 
{
     get => new ConcurrentBag<Bike>()
}
Run Code Online (Sandbox Code Playgroud)