Коллекция была изменена;операция перечисления может не выполняться - PullRequest
3 голосов
/ 27 марта 2012

мы недавно получили эту ошибку и понятия не имеем, почему, мы не изменяем какую-либо коллекцию, мы даже удалили большинство 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)

Любая помощь приветствуется.

Ответы [ 2 ]

5 голосов
/ 02 мая 2013

Я видел, как эта проблема всплывала у нас, поэтому я немного покопался. Ясно, что это происходит глубоко внутри MVC на основе трассировки стека, но похоже, что MVC 5 должен исправить это . Версия слева - MVC4, а справа - текущая версия MVC5 на момент публикации. Если вы проверите метод RemoveDuplicates(), похоже, он был изменен для предотвращения исключений, которые мы видим.

0 голосов
/ 27 марта 2012

Поможет больше кода вашего экземпляра списка.

Реально, я бы проверил, что перечислимое, которое вы передаете в конструктор списка, не изменилось. Когда вы используете IEnumerable, вы генерируете перечисляемый в этот момент, тогда как IQueryable позволяет вам отложить генерацию перечислимого до контрольной точки выполнения.

Мне кажется, что вы генерируете IEnumerable To для перехода к конструктору списка, но вы изменяете список источников перед тем, как это сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...