【问题标题】:Hashtable insert failed. Load factor too high. - asp.NET 4.0 MVC3哈希表插入失败。负载系数太高。 - asp.NET 4.0 MVC3
【发布时间】:2012-02-02 14:52:43
【问题描述】:

我们有一个在 F5 负载平衡服务器上运行的 ASP.NET 4.0 MVC3 应用程序。

我们收到了以下异常。我们不在我们的 Web 应用程序中执行多线程,但不知道 F5 负载平衡服务器是否可以考虑在内。我们看到早期版本的 .NET 上出现异常的位置(大多数其他帖子都涉及 .NET 2.0 和 3.5)。有没有人遇到过 .NET 4.0 的这个问题?

该异常导致应用程序无法使用,因为在登录时无法加载任何页面而不遇到异常。

已审核的其他链接:

2012-02-02 06:01:42,671 [26] 致命系统 [(null)] – 未处理 XYZ 应用程序中发生异常。 System.InvalidOperationException:哈希表插入失败。负载系数 太高。最常见的原因是多个线程写入 Hashtable 同时进行。在 System.Collections.Hashtable.Insert(对象键,对象 nvalue,布尔值 添加)在 System.ComponentModel.TypeDescriptor.NodeFor(类型类型, 布尔值 createDelegator) 在 System.ComponentModel.TypeDescriptor.GetProvider(类型类型)在 System.ComponentModel.DataAnnotations.AssociatedMetadataTypeTypeDescriptionProvider..ctor(类型 类型)在 System.Web.Mvc.ModelBinderDictionary.GetBinder(类型 modelType, IModelBinder fallbackBinder) 在 System.Web.Mvc.ControllerActionInvoker.GetModelBinder(参数描述符 参数描述符)在 System.Web.Mvc.ControllerActionInvoker.GetParameterValue(ControllerContext 控制器上下文,参数描述符参数描述符)在 System.Web.Mvc.ControllerActionInvoker.GetParameterValues(ControllerContext 控制器上下文,动作描述符动作描述符)在 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext 控制器上下文,字符串动作名称)在 System.Web.Mvc.Controller.ExecuteCore() 在 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext)
在 System.Web.Mvc.MvcHandler.c__DisplayClass6.c__DisplayClassb.b__5() 在 System.Web.Mvc.Async.AsyncResultWrapper.c__DisplayClass1.b__0() 在 System.Web.Mvc.MvcHandler.c__DisplayClasse.b__d() 在 System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() 在 System.Web.HttpApplication.ExecuteStep(IExecutionStep 步骤, Boolean & completedSynchronously)

从堆栈跟踪中可以看出,它没有指向我们代码中的特定位置,因此难以调试。

任何防止遇到此异常的建议将不胜感激。

【问题讨论】:

  • 您是否尝试过锁定哈希表,执行您的操作然后解锁它?备注下的第一个示例:msdn.microsoft.com/en-us/library/…
  • @Splash-X:整个堆栈跟踪都在框架代码中。
  • 声明“当用户加载页面时”会有所帮助
  • 这个错误是从应用程序池启动时发生在每个请求上,还是在应用程序池运行一段时间后发生?是否有特定的负载阈值(总请求数或每秒请求数?)导致它?您能否向我们提供有关您尝试在 Action 中绑定的模型的更多信息? NodeFor 方法在内部使用 Wea​​kHashTable。添加新元素时,它确实会在表格上使用锁定。
  • 你见过this blog post吗?

标签: asp.net-mvc asp.net-mvc-3 .net-4.0 load-balancing


【解决方案1】:

这是一个不常见的问题,但确实发生在很多人身上(包括我在内)。它似乎与任何特定的负载阈值无关,它只是“发生”,一旦发生,它就会继续更频繁地发生,无论负载如何。
解决方案:
临时:重置 IIS 并交叉手指它不会再次发生
永久:从KB article 中描述的 microsoft 获取补丁或等待下一个版本的 .Net 修复(据报道已在 4.5 Beta 中修复)

【讨论】:

    【解决方案2】:

    查看 Kim 在此线程中的回复:http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/172f4f77-601e-4b4f-8d98-582f8f62a98e


    嗨,马特,

    在 .NET 2.0 中,这个错误几乎总是由多个线程同时修改 Hashtable 引起的。解决方法是在修改 Hashtable 之前插入锁,因为 Hashtable 不是多写线程安全的。另一种可能的解决方案是通过 Hashtable.Synchronized 使用同步包装器,但我们建议使用前者以获得更好的控制。

    如果是您的代码修改了哈希表,这就是解决方法。根据您提供的信息,我认为情况并非如此。您提到您在 ASP 2.0 网站中遇到此错误,因此这可能是由下游 Hashtable 调用程序引起的。例如,如果调用堆栈如下所示,请注意这是已在最新版本中修复的错误。

    谢谢, 金

    堆栈跟踪:在 System.Collections.Hashtable.Insert(Object key, Object nvalue, Boolean add) 在 System.Collections.Hashtable.set_Item(对象键,对象值) 在 System.ComponentModel.TypeDescriptor.CheckDefaultProvider(类型类型) 在 System.ComponentModel.TypeDescriptor.NodeFor(类型类型,布尔 createDelegator) 在 System.ComponentModel.TypeDescriptor.GetDescriptor(类型类型,字符串类型名称) 在 System.ComponentModel.TypeDescriptor.GetAttributes(类型 componentType) 在 System.Web.UI.ThemeableAttribute.IsTypeThemeable(类型类型) 在 System.Web.UI.Control.ApplySkin(页面页面) 在 System.Web.UI.Control.InitRecursive(控件命名容器) 在 System.Web.UI.Control.InitRecursive(控件命名容器) 在 System.Web.UI.Control.InitRecursive(控件命名容器) 在 System.Web.UI.Control.InitRecursive(控件命名容器) 在 System.Web.UI.Control.InitRecursive(控件命名容器) 在 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

    【讨论】:

      猜你喜欢
      • 2010-10-05
      • 2011-01-10
      • 2023-03-29
      • 2010-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 2015-06-25
      相关资源
      最近更新 更多