私は古き良きInvalidOperationException
標準メッセージでスローされています
コレクションが変更されました。列挙操作が実行されない場合があります。
問題は、列挙子がそれ自体を変更していないことです。次に例を示します。
private TRoute _copyRoute(TRoute route)
{
TRoute tempRoute = new TRoute();
tempRoute.Initialize(route.Resource);
foreach (TVisit visit in route)
{
tempRoute.Add(visit);
}
tempRoute.EndLocation = route.EndLocation;
return tempRoute;
}
私のコードはマルチスレッド(この例では約12〜15スレッド)であり、各スレッドはルートの独自のディープクローンで動作することになっています。明らかにどこかで問題が発生していますが、私の質問は、これほど多くのスレッドでこれを追跡するにはどうすればよいですか?数を減らすと、問題が顕在化するのを大幅に防ぐことができます。
この場合、私のルートインスタンスはIListであるため、インターフェイスに何かを追加して遊ぶことができます。その下には、独自のリスト実装があります。
編集
追加するだけで、これをToArray()またはToList()して、ここでの問題を無視することもできますが、実際にはそうしたくありません。原因を突き止めたいと思います。例えば:
次のように変更すると:
private TRoute _copyRoute(TRoute route)
{
TRoute tempRoute = new TRoute();
tempRoute.Initialize(route.Resource);
foreach (TVisit visit in route.ToList())
{
tempRoute.Add(visit);
}
tempRoute.EndLocation = route.EndLocation;
return tempRoute;
}
次に、ToList()の直前にチャンスが発生したため、このアサートに失敗します...その変更がどこで発生しているかを確認する必要があります
TRoute tempRoute1 = CopyRoute(route1);
TRoute tempRoute2 = CopyRoute(route2);
Debug.Assert(tempRoute1.Count == route1.Count);