2010-05-17 58 views
1

我在这里面临一个非常奇怪的错误,我不太确定如果我遵循解决它的正确途径,甚至如何解决它。与log4net和NHibernate的Visual Studio 2008 ContextSwitchDeadlock

这是我面临的问题:我开始调试使用log4net,NHibernate和LINQ到NHibernate的WPF应用程序,以及当我试图从数据库中获取实体时,我的应用程序有时VS挂了很多时间,并在一段时间后的异常对话框打开,显示含有上的ContextSwitchDeadlock MDA以下信息的消息:

的CLR一直无法从COM上下文0x34fc1a0转变到COM上下文0x34fc258 60秒。拥有目的地上下文/公寓的线程很可能要么进行非抽水等待,要么处理非常长的运行操作而不抽取Windows消息。这种情况通常会对性能产生负面影响,甚至可能导致应用程序无法响应或内存使用量不断累积。为了避免这种情况

我将代码文件复制到一个新的项目中,并删除了旧项目,看看我是否可以让这条消息消失,认为它与我的配置有关。我开始一次添加几件东西,看看是什么导致了它,当我包含log4net配置代码时,错误再次出现。首先我把它通过集信息和应用程序启动后低谷代码配置,绝对什么都没有:(

因此改变,这里是我的发现:

  • 它只有当我使用log4net的发生。
  • 当从NHibernate的数据库(延迟加载)加载一个实体它发生。

我不知道什么可能是这个错误的根源,它只是在Visual Studio调试时发生的。我已经试过遵循“启用和禁用”步骤禁用MDAs“部分:http://msdn.microsoft.com/en-us/library/d21c150d.aspx,但这也不起作用,VS仍然挂起,并增加了内存使用量。

当我运行程序通常都没有出现这种情况,所以我敢肯定这不是一个死锁的情况,因为这个问题表明:contextswitchdeadlock(我也尝试张贴在那里的解决方案)。

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

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

在此先感谢,

豪尔赫·巴尔加斯。

+0

您使用的是什么log4net appender? – 2010-05-18 00:19:37

+0

你是男人!我不知道为什么会发生这种情况,但在使用DebugAppender时,表中的所有实体(如11k)都已加载,并将其所有数据写入调试输出。这导致了ContextSiwtchDeadlock MDA,因为它花费了超过60秒的时间运行。 – 2010-05-18 21:28:59

回答

2

使用DebugAppender时,加载数据库中的所有实体并将其所有数据写入调试输出。这是造成ContextSwitchDeadlock MDA的原因,因为它花费了超过60秒的时间运行。

禁用DebugAppender解决了我的问题。

感谢Mauricio Scheffer的提示。