Wol*_*lf5 87
我会说错误在于对象_bikes不是线程安全的.如评论所述,某处有一个未被锁定的_bikes对象的修改.
这是一个瞬间错误,当测量_bikes的大小时,变量bs设置为大小X. 在将要填充列表的下一个瞬间,_bikes对象的大小增加,从而产生错误.
所以仔细阅读你的代码.查找_bikes对象的所有引用,并确保它们是线程安全处理(带锁).
那么你可以尝试:
using System.Linq; //ToList() is an extension function defined here
...
lock(_bikes)
return _bikes.ToList();
Run Code Online (Sandbox Code Playgroud)
这里讨论了异常的细节:为什么foreach循环在某些情况下不起作用?
出现此错误是因为多个线程在单个列表中添加项目。默认情况下,列表不是线程安全的解决方案。在多线程代码中,建议只从列表中读取,而不是写入。
如上所述这里:
如果您只是从共享集合中读取数据,则可以使用 System.Collections.Generic 命名空间中的类。
更好地使用线程安全的解决方案,如System.Collections.Concurrent命名空间,它提供了ConcurrentBag、ConcurrentDictionary、ConcurrentQueue、ConcurrentStack等实现。
例如:
public ConcurrentBag<Bike> bikesCopy
{
get => new ConcurrentBag<Bike>()
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
50378 次 |
| 最近记录: |