Visual Studio 2008 ContextSwitchDeadlock с log4net и NHibernate - PullRequest
1 голос
/ 17 мая 2010

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

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

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

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

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

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

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

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

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

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

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

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

1 Ответ

2 голосов
/ 25 мая 2010

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

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

Спасибо Маурисио Шефферу за подсказку.

...