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
ので、200true
になると予想queue.Count
します。しかし、奇妙な結果が得られます...時には200、時には198または199。
私はここで何が間違っているのですか?各スレッドが確実に考慮されるようにするにはどうすればよいですか?