DirectorySearcher Асинхронное использование await - PullRequest
1 голос
/ 16 января 2020

Я использую. net 4.7.2 (не ядро) и C#.

Мне нужно придумать способ, чтобы не блокировать мои текущие асинхронные c задачи, и я есть необходимость поиска пользователя как часть этих задач. Ранее я выполнял операции DirectorySearcher, поэтому я знаю, что вложение в AD и первый поиск могут занять несколько секунд, что действительно вызовет рывок в передачах, если я попытаюсь вызвать его из моих существующих асин c методов.

Я обнаружил, что DirectorySearcher имеет свойство "Asynchronous". Но я не думаю, что он использует шаблон asyn c.

        DirectorySearcher ds = new DirectorySearcher();
        ds.Asynchronous = true;
        ds.Filter = "(&(objectclass=user)(samaccountname=testaccount)";
        ds.PropertiesToLoad.Add("samaccountname");
        SearchResult sr = await ds.FindOne();

Конечно, последняя строка выдает ошибку, потому что FindOne не является асинхронным c методом. Я уже знаю, что если я удалю ожидание, оно будет скомпилировано. Но это не решает мою проблему с вызовом этого из существующих ожидаемых методов. Мне нужно найти способ сделать asyn c поиск в AD ...

Кто-нибудь знает, как я мог заставить это работать в. net framework (не core)?

Ответы [ 2 ]

0 голосов
/ 17 января 2020

Ни один из продуктов MS не делает этого ....

Я нашел активный проект nuget с именем ldap 4net, который делает.

0 голосов
/ 16 января 2020

Попробуйте запустить его в пуле потоков.

private async void MyAsyncMethod()
{
   // do some asynchronous thing
   // await something

   // then, run below on thread pool, which would not block MyAsyncMethod
   Task.Run(() =>
   {
      DirectorySearcher ds = new DirectorySearcher();
      ds.Asynchronous = true;
      ds.Filter = "(&(objectclass=user)(samaccountname=testaccount)";
      ds.PropertiesToLoad.Add("samaccountnamt");
      SearchResult sr = ds.FindOne();
   });
}

Для справки: https://docs.microsoft.com/dotnet/api/system.threading.tasks.task.run

...