我有一个带有运行嵌套ParallelFor
循环的方法的类。基本上我正在迭代一个对象列表,然后是一个包含在每个对象属性中的列表。
根据为内部循环中的每个对象计算的条件,我想添加到队列中。我正在使用“syncRoot”对象来尝试在添加到队列时保持并发性。
public class ParallelTest
{
private static object syncRoot = new object();
public void Test() {
List<MyLog> queue = new List<MyLog>();
...
Parallel.For(0, set.Count(), delegate(int i)
{
var obj = set[i];
List<Connection> conns = obj.GetConnections();
...
Parallel.For(0, conns.Count(), delegate(int j)
{
Connection c = conns[j];
MyLog log = new MyLog();
...
if (condition)
{
lock (syncRoot)
{
queue.Add(log);
}
}
}
}
Debug.WriteLine(queue.Count);
}
}
我遇到的问题是,似乎并非我的所有对象都被添加到队列中。我正在测试一组 200 个对象并将 替换为condition
,true
所以我希望queue.Count
是 200。但是,我得到了奇怪的结果......有时是 200,有时是 198 或 199。
我在这里做错了什么?如何确保每个线程都被考虑在内?