集合已被修改;枚举操作可能无法执行。

3

最近我们一直收到这个错误,但不知道为什么,我们没有修改任何集合,甚至从页面上删除了大部分foreach循环,以下是错误的堆栈跟踪:

   Exception type: InvalidOperationException 
    Exception message: Collection was modified; enumeration operation may not execute.
   en System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   en System.Linq.Enumerable.WhereListIterator`1.MoveNext()
   en System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   en System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   en System.Linq.Enumerable.<SelectManyIterator>d__14`2.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.OrderedEnumerable`1.<GetEnumerator>d__0.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext()
   en System.Web.Mvc.FilterProviderCollection.<RemoveDuplicates>d__b.MoveNext()
   en System.Linq.Buffer`1..ctor(IEnumerable`1 source)
   en System.Linq.Enumerable.<ReverseIterator>d__a0`1.MoveNext()
   en System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
   en System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   en System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   en System.Web.Mvc.FilterInfo..ctor(IEnumerable`1 filters)
   en System.Web.Mvc.ControllerActionInvoker.GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
   en System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName)
   en System.Web.Mvc.Controller.ExecuteCore()
   en System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
   en System.Web.Mvc.MvcHandler.<>c__DisplayClass6.<>c__DisplayClassb.<BeginProcessRequest>b__5()
   en System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass1.<MakeVoidDelegate>b__0()
   en System.Web.Mvc.MvcHandler.<>c__DisplayClasse.<EndProcessRequest>b__d()
   en System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
   en System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

非常感谢您的帮助。


3
请确定并发布引发此异常的代码。这并不是在foreach块中发生,而是在linq查询中发生。 - phoog
1
不同意这是一个重复的问题。这里的问题是MVC4中的一个错误结果。MVC4错误的根本原因可能与链接问题的重复有关,但该问题提供的答案无法解决此问题。@RyanVersaw的答案(升级到MVC5)似乎更直接适用于此处。 - Rob Hruska
2个回答

5

我也遇到了这个问题,所以进行了一些调查。根据堆栈跟踪,很明显这是深层的MVC问题,但看起来MVC 5应该会解决这个问题。左边的版本是MVC4,右边的版本是发布此文章时的当前版本MVC5。如果您查看RemoveDuplicates()方法,它似乎已经被修改以防止像我们看到的异常。


0

提供更多列表实例化的代码将有助于解决问题。

实际上,我会检查您传递给列表构造函数的可枚举对象是否已更改。当您使用IEnumerable时,您在那一点生成可枚举对象,而IQueryable允许您推迟生成可枚举对象直到执行的控制点。

在我看来,您正在生成一个IEnumerable对象以传递给列表构造函数,但在此之前您修改了源列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接