我有一个很好的老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 实现。
编辑
补充一下,我可以使用 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);