DisconnectedContext был обнаружен в LINQ To ActiveDirecory

2

Я использую LinqToActiveDirectory из codeplex, и когда я выполняю запрос с использованием DirecotrySource, я получаю следующую ошибку:

DisconnectedContext был обнаружен

Сообщение: Контекст 0x3c5050 'отключен. Освобождение интерфейсов из текущего контекста (контекст 0x3c4f98). Это может привести к повреждению или потере данных. Чтобы избежать этой проблемы, убедитесь, что все контексты/квартиры остались в живых до тех пор, пока приложение полностью не будет выполнено с помощью RuntimeCallableWrappers, которые представляют COM-компоненты, которые живут в них.

Это происходит только при отладке, если я установил точку останова в последних фигурных скобках метода и нажмите F10, чтобы закончить выполнение. При запуске без отладки он работает как ожидалось. Кроме того, если я вызываю GC.Collect() перед последними фигурными скобками, я могу спокойно выйти. Я не хочу называть GC, поскольку я знаю, что лучше оставить его для выполнения его работы.

Я буду рад получить представление о том, как решить эту проблему. Спасибо, Тамир.

Теги:
linq
debugging
active-directory
com

1 ответ

1
Лучший ответ

У вас все еще есть эта проблема в режиме выпуска, и это приведет к большому сбою или повреждению данных позже, но в режиме отладки он запускает помощника по администрированию отладки, который пытается помочь вам устранить проблему: http://msdn.microsoft.com/en-us/library/2c1czate.aspx

В общем случае проблема заключается в том, что COM-компоненты часто принадлежат определенному потоку (в зависимости от того, как он поддерживает размещение и где он был создан). Наиболее распространенная ситуация заключается в том, что вы создали контекст в фоновом потоке или потоке рабочего потока threadpool, и теперь этот поток исчез (который убивает COM-квартиру или контекст, таким образом убивая COM-компонент), и вы позже пытаетесь использовать COM-объект.

В конечном итоге System.DirectoryServices использует ADSI, который представляет собой набор COM-компонентов. Так вы передаете материал между потоками, используя Parallel LINQ или что-то в этом роде? например: если вы используете ленивое выполнение LINQ в фоновом потоке, а затем передаете IEnumerable в поток переднего плана, фактическое выполнение запроса произойдет в потоке переднего плана... но если вы вставьте туда .ToList(), вы будет принудительно оценивать фоновый поток.

Пожалуйста, сообщите нам, если это поможет, и если вы используете потоки, и мы можем предоставить больше направлений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню