我在线程A中填充列表并在线程B中对其进行排序。
var SortedListByDistance = Distancelist.OrderBy(o => o._Distance).Where(o => o.Distance <= _Distance).ToList();
现在我收到以下错误:
目标数组不够长。检查destIndex和长度,和 数组的下界。
对Google进行一些研究我遇到了“线程安全”主题。基本上列表在另一个线程中被锁定(?)并且触发了异常。
这至少是我理解它的方式。现在的问题是如何避免这个问题?
答案 0 :(得分:5)
实际上,你不能以某种方式锁定List<T>
,没有人可以在那个时候使用它。但是你可以创建两个代码块,锁定另一个代码块(Mutual Exclusion)。
所以你可以使用像
lock(Distancelist) {
var SortedListByDistance = Distancelist.OrderBy(o => o._Distance).Where(o => o.Distance <= _Distance).ToList();
}
您需要在线程A中锁定同一对象,以实现互斥。
PS:由于多种原因,不鼓励锁定您实际想要使用的对象。更干净的方法是使用另一个对象,如object Distancelist_sync = new object()
,然后用于锁定。