У меня есть старое доброе 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, поэтому я могу поиграть с добавлением элементов в интерфейс.Под ним есть своя собственная реализация List.
EDIT
Просто добавьте, я мог бы 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);