【发布时间】:2014-06-11 14:06:11
【问题描述】:
我在使用 Parallel.For 方法时遇到问题。我正在打一个 GET 电话以取回一份清单。然后我想把这个列表添加到主列表中。我已经尝试过 addRange ,它不是线程安全的,并且会在列表中返回错误的数据。我也尝试使用 ConcurrentBag 也没有得到正确的数据。当我说没有得到正确的数据时,我的意思是列表中的某些数据要么重复,要么被覆盖。
这是我的代码(更新):
var thisLock = new Object();
var list = new List<Person>();
Parallel.For(1, 10, x =>
{
request.Page = x;
response = Get(request); // call to client
lock(thisLock)
{
list.AddRange(response);
}
}
除了 addRange 或 ConcurrentBag 之外的任何其他想法
【问题讨论】:
-
锁定列表。还有其他机制,但这是最简单的一种,因为添加到列表中不太可能是代码中的主要性能瓶颈。
-
为什么不直接锁定列表?
-
正如@Rotem 所暗示的,添加到列表时需要锁定列表。 Concurrentbag 应该处理这个问题。没有得到正确的数据是什么意思?
-
当我锁定主列表时只会打乱一个电话。这意味着主列表的一部分中的数据将被覆盖。
-
@Beastwood 这不是
lock的正确方法,您应该定义一个特定的锁定对象。无论如何,ConcurrentBag<T>是您尝试做的推荐集合。您的数据“重复”这一事实向我表明,您的服务器正在返回重复数据,而不是代码以某种方式复制它。
标签: .net multithreading thread-safety task-parallel-library parallel.for