Visual Studio 2008 ContextSwitchDeadlock с log4net и NHibernate

Здесь я сталкиваюсь с очень странной ошибкой, и я не совсем уверен, правильно ли я иду к ее решению или даже как ее решить.

Вот проблема, с которой я сталкиваюсь: я начинаю отлаживать приложение WPF, которое использует log4net, NHibernate и LINQ для NHibernate, и когда я пытаюсь получить Entity из базы данных, мое приложение и иногда VS зависают в течение длительного времени, а после В то время как открывается диалоговое окно исключения, показывающее сообщение, содержащее следующую информацию о ContextSwitchDeadlock MDA:

CLR не удалось перейти из контекста COM 0x34fc1a0 в контекст COM 0x34fc258 в течение 60 секунд. Поток, который владеет целевым контекстом / квартирой, скорее всего либо выполняет некачивающее ожидание, либо обрабатывает очень длительную операцию без прокачки сообщений Windows. Эта ситуация, как правило, оказывает негативное влияние на производительность и может даже привести к тому, что приложение перестает отвечать на запросы или постоянно накапливается использование памяти. Чтобы избежать этого

Я скопировал файлы кода в новый проект и удалил старый проект, чтобы посмотреть, смогу ли я удалить это сообщение, думая, что оно как-то связано с моей конфигурацией. Я начал добавлять несколько вещей за раз, чтобы посмотреть, что их вызвало, и когда я включил код конфигурации log4net, ошибка снова появилась. Сначала я включил его через AssemblyInfo, а затем через конфигурацию кода при запуске приложения, и абсолютно ничего не изменилось:(

Итак, вот мои выводы:

  • Это происходит только тогда, когда я использую log4net.
  • Это происходит, когда NHibernate загружает сущность из базы данных (отложенная загрузка).

Я не знаю, что может быть источником этой ошибки. Это происходит только при отладке в Visual Studio. Я попытался выполнить действия, описанные в разделе "Включение и отключение MDAs" на следующей странице: http://msdn.microsoft.com/en-us/library/d21c150d.aspx, но это тоже не работает, VS все еще зависает и увеличивается использование памяти.

Когда я обычно запускаю программу, ничего из этого не происходит, так что я почти уверен, что это не тупиковая ситуация, как предполагает этот вопрос: contextswitchdeadlock (я также попробовал опубликованные там решения).

Из-за этого я решил отключить log4net и включить его снова при развертывании моего приложения.

Я публикую этот вопрос, чтобы узнать, сталкивался ли кто-то еще с этой ошибкой или у кого-то есть предложения по ее устранению. Наконец, это может помочь кому-то еще, сталкивающемуся с той же самой проблемой.

Заранее спасибо,

Хорхе Варгас.

1 ответ

Решение

При использовании DebugAppender все объекты в базах данных загружаются и все его данные записываются в выходные данные отладки. Это стало причиной MDA ContextSwitchDeadlock, так как для его выполнения потребовалось более 60 секунд.

Отключение DebugAppender решило мою проблему.

Спасибо Маурисио Шефферу за отзыв.

Другие вопросы по тегам