我在线程 A 中填充一个列表并在线程 B 中对其进行排序。
var SortedListByDistance = Distancelist.OrderBy(o => o._Distance).Where(o => o.Distance <= _Distance).ToList();
现在我收到以下错误:
Destination array was not long enough. Check destIndex and length, and the array's lower bounds.
在 Google 上做一些研究时,我遇到了“线程安全”主题。基本上列表在另一个线程中被锁定(?)并触发异常。
至少我是这么理解的。现在的问题是我怎样才能避免这个问题?
实际上,您无法锁定 List<T>
在某种程度上,那个时候没有人可以使用它。但是您可以创建两个代码块,将另一个代码块锁定(互斥)。所以你可以使用类似的东西
lock(Distancelist) {
var SortedListByDistance = Distancelist.OrderBy(o => o._Distance).Where(o => o.Distance <= _Distance).ToList();
}
您需要在线程 A 中锁定同一个对象,以实现互斥。
PS:出于多种原因,不鼓励锁定您实际想要使用的对象。更简洁的方法是使用另一个对象,例如 object Distancelist_sync = new object()
然后用于锁定。
我是一名优秀的程序员,十分优秀!