【问题标题】:Collection was modified error in asp.net MVC 4集合在 asp.net MVC 4 中被修改错误
【发布时间】:2012-12-14 09:07:29
【问题描述】:

我试图在我的 ASP.NET MVC 4 应用程序中查找以下错误的来源。

Exception type: System.InvalidOperationException
Exception message: Collection was modified; enumeration operation may not execute

Stack trace: at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.MoveNext()
at System.Linq.Buffer`1..ctor(IEnumerable`1 source)
at System.Linq.Enumerable.ToArray[TSource](IEnumerable`1 source)
at System.Web.Mvc.MvcHandler.RemoveOptionalRoutingParameters()
at System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state)
at System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)

问题是我有一个 Collection 正在迭代的所有(少数)地方我没有以任何方式更改 Collection 结构。堆栈跟踪没有太大帮助,因为它不包含对我的代码的任何引用。

我已经阅读了很多关于这个主题的帖子,基本上这就是他们提到的解决方案。 有人知道此类问题的其他解决方案吗?有关如何获取有关错误的更多信息的任何提示?

【问题讨论】:

  • 把你的代码放在这里,告诉你尝试了什么?
  • 您是否正在运行任何可能会更改值的后台线程?
  • 您必须发布代码——最有可能的原因是修改了闭包,或者延迟了 IEnumerable 枚举。
  • 看起来您在Dictionary 上调用ToArray其他东西 正在修改字典 ToArray 调用.可能的线程问题。
  • 我倾向于同意@Rawling 这条线RemoveOptionalRoutingParameters 确实指出了这一点。可能有一些我有的路线......

标签: c# asp.net-mvc collections error-handling


【解决方案1】:

nrod,为了完整起见,最好发布您的代码。

但是,从您的堆栈跟踪中,我已经可以看到(MVC)框架(例如 System.Web)中发生了错误。 Í如果堆栈跟踪指向您自己的代码,则问题通常是由于在迭代集合时(例如在 foreach 循环中)操作集合(例如删除、添加)。一些建议是以相反的方式迭代或在您的集合上使用 .ToList() ,请参阅: Collection was modified; enumeration operation may not execute Collection was modified; enumeration operation may not execute - why?

但是,您的堆栈跟踪表明问题出在您的代码对 (MVC) 框架的调用。此类问题可能是由于在共享自定义实现的 IRouteHandler.GetHttpHandler() 中使用实例成员变量引起的。这是因为实例成员不是线程安全的,如 MSDN 中所述: http://msdn.microsoft.com/en-us/library/system.web.http.webhost.httpcontrollerroutehandler%28v=vs.108%29.aspx

您的堆栈跟踪表明您确实在使用成员变量。当执行大量并发调用时(例如在生产环境中),可能会发生该错误。

您可以通过重构代码以不使用任何实例成员来解决此问题。这可能会导致代码有些单一和重复。例如,当重构为仅使用局部变量时。但是您也可以尝试将使用重构为公共静态成员或静态函数,因为它们是线程安全的。

在自己解决了这个问题之后,我决定最好总是对新代码进行一些负载测试,否则这些问题只会在生产环境中检测到!

【讨论】:

  • 感谢您的见解。我已经在那个方向上更改了我的自定义处理程序public IHttpHandler GetHttpHandler(RequestContext requestContext),看来我已经修复了错误......
猜你喜欢
  • 2011-09-12
  • 1970-01-01
  • 2014-07-29
  • 2017-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多