DisconnectedContext был обнаружен в LINQ To ActiveDirecory - PullRequest
2 голосов
/ 15 июня 2009

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

Обнаружен DisconnectedContext

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

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

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

1 Ответ

1 голос
/ 07 сентября 2011

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...