Невозможно использовать 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;
}