Невозможно использовать Async в ожидании вызова службы мыла

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

public void GetPersonData()
{
    var persons = queryProcessor.Process(new GetPersonsWhichNeedApiCalls());
    var watch = System.Diagnostics.Stopwatch.StartNew();
    // the code that you want to measure comes here
    SearchAPI(persons).Wait();
    watch.Stop();
    var elapsedMs = watch.ElapsedMilliseconds;
}

private async Task SearchAPI(IEnumerable<Person> persons)
{
    var tasks = persons.Select(async eachPerson =>
    {
        var result = await asyncQueryProcessor.ProcessAsync(new PersonSearchCall { Name = eachPerson.Name, Id = eachPerson.Id });
        commandProcessor.Process(new CreatePersonSearch()
        {
            PersonSearch = result
        });
    });
    await Task.WhenAll(tasks);

}

запрос:

namespace Sample.AsyncQueries
{
    public class PersonSearchCall : IQuery<PersonSearch>
    {
        public string Name { get; set; }
        public int Id { get; set; }
    }

    public class PersonSearchCallHandler : IAsyncQueryHandler<PersonSearchCall, PersonSearch>
    {
        private readonly IQueryProcessor queryProcessor;
        private readonly ICommandProcessor commandProcessor;

        public PersonSearchCallHandler(ICommandProcessor commandProcessor,
            IQueryProcessor queryProcessor)
        {
            this.queryProcessor = queryProcessor;
            this.commandProcessor = commandProcessor;
        }

        public async Task<PersonSearch> HandleAsync(PersonSearchCall query)
        {
            var client = new PersonServiceSoapClient();

            var personResponses = await client.PersonSearchAsync(inputs).ConfigureAwait(false);
            //Build the person Object 
            return person;
        }
    }
}

С помощью этого простого инжектора я смог добиться этого, используя синхронный способ, но, поскольку я вызываю список людей, и каждый вызов занимает около 2 секунд. я пытаюсь использовать использование асинхронных и жду, чтобы сделать несколько звонков из списка.

1 ответ

Решение

Как прокомментировал StriplingWarrior, ваша проблема в том, что вы блокируете async код Вам нужно использовать async все пути:

public async Task GetPersonData()
{
  var persons= queryProcessor.Process(new GetPersonsWhichNeedApiCalls());
  var watch = System.Diagnostics.Stopwatch.StartNew();
  await SearchAPI(persons);
  var elapsedMs = watch.ElapsedMilliseconds;
}
Другие вопросы по тегам