我在这里遇到了一个非常奇怪的错误,我不确定我是否正在遵循正确的路径来解决它,甚至如何解决它。
这是我面临的问题:我开始调试使用 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 并再次启用它。
我发布这个问题是为了了解其他人是否遇到过这个错误,或者是否有人对如何解决它有一些建议。最后,它可能会帮助其他面临同样问题的人。