ASP. NET Веб-API - разница между Asyn c и синхронным методом в сетевой консоли браузера - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь понять этот код, который я только что нашел в этой ссылке :

Мне любопытно, какая разница между использованием асинхронного и синхронного метода в Интернете API:

Асинхронный:

[HttpGet("{id}", Name = "GetBook")]
public async Task<IActionResult> GetBookWithBookCovers(Guid id)
{
    var bookEntity = await _booksRepository.GetBookAsync(id);

    if (bookEntity == null)
    {
        return NotFound();
    }

    // get bookcovers
    var bookCovers = await _booksRepository.GetBookCoversAsync(id);

    // map book & covers into one BookWithCovers
    var mappedBook = _mapper.Map<BookWithCovers>(bookEntity);
    return Ok(_mapper.Map(bookCovers, mappedBook));
}

Синхронный:

[HttpGet("{id}", Name = "GetBook")]
public IActionResult GetBookWithBookCovers(Guid id)
{
    var bookEntity = _booksRepository.GetBook(id);

    if (bookEntity == null)
    {
        return NotFound();
    }

    // get bookcovers
    var bookCovers = _booksRepository.GetBookCovers(id);

    // map book & covers into one BookWithCovers
    var mappedBook = _mapper.Map<BookWithCovers>(bookEntity);
    return Ok(_mapper.Map(bookCovers, mappedBook));
}

Если в одном из кодов этих двух методов есть длительный запрос, что будет поведение в сетевой консоли браузера?

Будет ли асинхронный метод возвращать код состояния 202 во время выполнения запроса? или он выдаст ошибку и скажет, как тайм-аут запроса?

1 Ответ

0 голосов
/ 06 августа 2020

Как сказал Ян Кемп «async / await ... не влияет на протокол HTTP» .

Клиентская точка зрения

Нет никакой разницы. Один и тот же код состояния OK вернется в обоих случаях, если во время обработки запроса не возникнет никаких исключений. Обработка

Syn c или Asyn c должна рассматриваться как деталь реализации. Если бы у вас была документация OpenAPI (также известная как Swagger), то оба метода выглядели бы одинаково.

Перспектива сервера

Ваш ASP. NET WebAPI ничего не вернет в вызывающий, пока не достигнет конца действия контроллера.

Ключевое слово await говорит:

  • Возможно, существует длительная операция.
  • Выполняется Thread не может перейти к следующему оператору, потому что он полагается на результат операции asyn c.
  • Поскольку Thread не может ничего сделать с этим запросом, имеет смысл вернитесь к ThreadPool и назначьте ему новое задание (например, другой запрос) до тех пор, пока не будет запущена операция asyn c.
  • Когда эта операция asyn c завершится, ThreadPool будет уведомлен, и он назначит оставшееся действие контроллера для соответствующего Thread.

async / await был разработан (в основном) для поддержки неблокирующих операций asyn c ввода-вывода. Это означает, что пока сетевой драйвер обрабатывает запрос ввода-вывода, до этого момента исполнители вычислений (потоки) могут работать и над другими вещами.

Короче говоря, async / await дает вам масштабируемость (большую пропускную способность) для серверных приложений. .

...