Асинхронный поиск каталогов (LDAP)

Я выполняю долгий поиск в активной директории и очень хотел бы использовать DirectorySearcher.Asynchronous = True. Microsoft предоставляет очень мало документации по MSDN

Асинхронный поиск может показывать результаты по мере их нахождения при одновременном поиске дополнительных результатов. Это полезно для таких задач, как заполнение списков.

Значение по умолчанию для этого свойства - false.

Как моя заявка узнать, когда поиск будет выполнен. Я не вижу никаких свойств, событий или обратных вызовов, которые бы обеспечивали это уведомление. У кого-нибудь есть идеи как получить этот функционал?

В основном я ищу это:

  • Начать поиск в асинхронном каталоге
  • Возврат результатов в System.Collections.Concurrent.ConcurrentQueue(Of Object)
  • Поскольку DirectorySearcher работает, я могу обрабатывать элементы, добавленные в очередь

Большое спасибо за Вашу помощь.

2 ответа

DirectoryServices использует ADSI для связи с AD. Когда для async установлено значение true, для параметра поиска ADS_SEARCHPREF_ASYNCHRONOUS устанавливается значение true с использованием IDirectorySearch.SetSearchPreferences.

Вот страница, которая объясняет различия между синхронизированным и асинхронным поиском. http://msdn.microsoft.com/en-us/library/windows/desktop/aa746498(v=vs.85).aspx

Это описывает пейджинг. http://msdn.microsoft.com/en-us/library/windows/desktop/aa746414(v=vs.85).aspx

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

Понимаю, что это очень старый вопрос, но я боролся с ним уже пару дней, поэтому пишу для всех остальных. Это Могу ли я получить более 1000 записей из DirectorySearcher?хорошо отвечает. Я прочитал это, поскольку поиск все еще происходит, пока вы перечисляете результаты.

              searcher.PageSize = 100;
        searcher.Asynchronous = true;
        var found = searcher.FindAll();

        foreach (var item in found)
        {
            myList.Add(item);
            Application.Current.Dispatcher.BeginInvoke(new Action(() =>
            {
                ; do something with the results to update your window
            }));
        }

        found.Dispose();
Другие вопросы по тегам