在另一个线程中填充的排序列表

时间:2015-05-26 08:40:33

标签: c# multithreading

我在线程A中填充列表并在线程B中对其进行排序。

 var SortedListByDistance = Distancelist.OrderBy(o => o._Distance).Where(o => o.Distance <= _Distance).ToList();

现在我收到以下错误:

  

目标数组不够长。检查destIndex和长度,和   数组的下界。

对Google进行一些研究我遇到了“线程安全”主题。基本上列表在另一个线程中被锁定(?)并且触发了异常。

这至少是我理解它的方式。现在的问题是如何避免这个问题?

1 个答案:

答案 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(),然后用于锁定。