【问题标题】:Visual Studio 2008 ContextSwitchDeadlock with log4net and NHibernate带有 log4net 和 NHibernate 的 Visual Studio 2008 ContextSwitchDeadlock
【发布时间】:2021-02-07 20:38:02
【问题描述】:

我在这里遇到了一个非常奇怪的错误,我不确定我是否正在遵循正确的路径来解决它,甚至是如何解决它。

这是我面临的问题:我开始调试使用 log4net、NHibernate 和 LINQ to NHibernate 的 WPF 应用程序,当我尝试从数据库中获取实体时,我的应用程序和有时 VS 会挂起很长时间,过了一会儿,一个异常对话框打开,显示一条消息,其中包含有关 ContextSwitchDeadlock MDA 的以下信息:

CLR 在 60 秒内无法从 COM 上下文 0x34fc1a0 转换到 COM 上下文 0x34fc258。拥有目标上下文/单元的线程很可能要么进行非泵送等待,要么处理非常长时间运行的操作而不泵送 Windows 消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序变得无响应或内存使用量随着时间的推移不断累积。为了避免这种情况

我将代码文件复制到一个新项目并删除了旧项目以查看是否可以使此消息消失,认为它与我的配置有关。我开始一次添加一些东西,看看是什么原因造成的,当我包含 log4net 配置代码时,错误再次出现。首先我通过 AssemblyInfo 包含它,然后在应用程序启动时通过代码配置包含它,并且完全没有任何改变:(

所以,这是我的发现:

  • 只有在我使用 log4net 时才会发生。
  • 当 NHibernate 从数据库加载实体时会发生这种情况(延迟加载)。

我不知道这个错误的来源可能是什么。它仅在 Visual Studio 中调试时发生。我已经尝试按照以下页面的“启用和禁用 MDA”部分的步骤进行操作:http://msdn.microsoft.com/en-us/library/d21c150d.aspx,但这也不起作用,VS 仍然挂起并且它的内存使用量增加了。

当我正常运行程序时,这一切都不会发生,所以我很确定这不是死锁情况,正如这个问题所暗示的那样:contextswitchdeadlock (我也尝试过那里发布的解决方案)。

因此,我决定在部署我的应用程序时禁用 log4net 并再次启用它。

我发布这个问题是为了了解其他人是否遇到过这个错误,或者是否有人对如何解决它有一些建议。最后,它可能会帮助其他面临同样问题的人。

【问题讨论】:

  • 您使用的是什么 log4net 附加程序?
  • 你就是那个男人!我不知道为什么会发生这种情况,但是当使用 DebugAppender 时,表中的所有实体(如 11k)都已加载,并且其所有数据都写入了调试输出。这导致 ContextSiwtchDeadlock MDA 运行时间超过 60 秒。

标签: wpf nhibernate log4net contextswitchdeadlock


【解决方案1】:

当使用 DebugAppender 时,数据库中的所有实体都被加载,其所有数据都写入调试输出。这导致 ContextSwitchDeadlock MDA 运行时间超过 60 秒。

禁用 DebugAppender 解决了我的问题。

感谢 Mauricio Scheffer 的提示。

【讨论】:

    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 2010-12-02
    相关资源
    最近更新 更多