Вызов синхронного метода в асинхронном режиме? - PullRequest
0 голосов
/ 28 декабря 2018

Я занимаюсь разработкой проекта ASP.NET MVC WebApi, и один из методов должен выполнить поиск LDAP.Объем информации, которую поиск извлекает с сервера LDAP, гарантирует, что вызов займет не менее 7 секунд.Вызов, поскольку он использует классы и методы System.DirectoryServices.Protocols, является синхронным и не изменяемым.

Объем трафика, который получит этот API, довольно велик (даже если API находится во внутренней сети), поэтому 7 секунддля каждого звонка на сервер LDAP не очень хорошая идея.Итак, я хочу знать это:

  • Это хорошая идея, чтобы обернуть это в асинхронном методе?
  • Как правильно синхронизировать этот вызов?(Является ли await Task.Run(() => Search(params)) приемлемым способом?)

Ответы [ 2 ]

0 голосов
/ 02 января 2019

PD: Основываясь на ответе Lucero, вот метод расширения, который скрывает вызовы APM и представляет себя как обычный Task<T> асинхронный метод:

public static async Task<DirectoryResponse> SendRequestAsync(this LdapConnection conn, string target, string filter,
    SearchScope searchScope, params string[] attributeList)
{
    if (conn == null)
    {
        throw new NullReferenceException();
    }
    var search_request = new SearchRequest(target, filter, searchScope, attributeList);
    var response = await Task<DirectoryResponse>.Factory.FromAsync(
        conn.BeginSendRequest,
        (iar) => conn.EndSendRequest(iar),
        search_request,
        PartialResultProcessing.NoPartialResultSupport,
        null);
    return response;
}

Это также может использоваться в качестве отправной точки дляваши собственные потребности (вы можете использовать аналогичный метод, чтобы "заставить" объекты, поддерживающие APM, вести себя в стиле на основе задач).

0 голосов
/ 28 декабря 2018

Как отмечается в комментарии, я не вижу, как сделать асинхронный вызов вообще помогло бы.Запуск его в другом потоке и ожидание (в соответствии с вашим вопросом «как правильно ...») использует столько же ресурсов, сколько и синхронный вызов и ожидание.

Обратите внимание, однако, что классы System.DirectoryServices.Protocolsтакие как LdapCollection имеют асинхронную поддержку со старым стилем APM (модель асинхронного программирования) (например, BeginSendRequest / EndSendRequest).

Вы можетелегко обернуть API в стиле APM в ожидаемый стиль на основе задач, используя TaskFactory<TResult>.FromAsync, это будет «правильным способом» использования этих классов с асинхронностью.См. Также Взаимодействие с другими асинхронными шаблонами и типами .

...