Хобрук: Ваш путь к мастерству в программировании

C# ASP.NET Core API Async/await VS Результат

Я немного запутался в передовых методах работы с C# и задачами.
Когда меня учили c# и задачам, это всегда была асинхронная функция, ожидающая задачи. Но недавно я провел небольшое исследование и нашел людей, которые говорят иначе. Они также говорят, что ограничение использования async и await может улучшить производительность и использование оперативной памяти.

Например, в этой записи Stackoverflow В нем говорится, что вы не должны всегда ждать каждую задачу, но пример не для ASP.NET API, и для получения новых данных не используются какие-либо предыдущие данные. Этот пост также выступает за то, чтобы не всегда ожидать каждая задача. Но опять же, пример — простая задача, которая выполняется.

Итак, мой вопрос для случаев, когда есть другая задача, на которой вторая задача должна ждать. Можете ли вы использовать .Result или нам лучше использовать async/await. Потому что я слышал, что .Result блокирует текущий поток. Но я не понимаю, как текущий поток не будет заблокирован ожиданием, поскольку вывод первого оператора необходим для второго оператора.

Пример без async/await

public Task<User> SaveUser(User user) 
{
    var dbUser = _userRepository.GetByUid(user.Id).Result;
    if(dbUser == null) {
        dbUser = new User();
        dbUser.Id = Guid.NewGuid();
    }
    dbUser.Name = user.Name;

    return _userRepository.Save(dbUser);

}

Пример с асинхронным/ожиданием

public async Task<User> SaveUser(User user) 
{
    var dbUser = await _userRepository.GetByUid(user.Id);
    if(dbUser == null) {
        dbUser = new User();
        dbUser.Id = Guid.NewGuid();
    }
    dbUser.Name = user.Name;

    return await _userRepository.Save(dbUser);

}

Примечание. Я также слышал, что при использовании пользовательского интерфейса важно, чтобы задачи, связанные с пользовательским интерфейсом, ожидались, но это будет для API.


  • Вы неправильно поняли прочитанное. В сообщении не говорится, что вы должны использовать .Result. В нем говорится, что вам не нужно await, если вы собираетесь вернуть задачу, не используя ее результат в своем методе. Здесь это не так, поэтому вы всегда должны использовать await 22.04.2021
  • But again the example is a simple task being passed through. точно. Это единственный случай, когда вы можете опустить await. async/await не делайте метод асинхронным. async — это просто синтаксический сахар, который позволяет использовать await для ожидания завершения уже асинхронного метода без блокировки. 22.04.2021
  • this would be for API's. здесь это еще важнее — вместо того, чтобы заблокировать одного пользователя, вы можете заморозить весь сервер или задержать каждый запрос на сайте. Каждый запрос обслуживается отдельным потоком из пула потоков. То же количество потоков (и ядер) можно использовать для обслуживания гораздо большего количества запросов на одном и том же железе, если избежать блокировки. 22.04.2021

Ответы:


1

Я рекомендую прочитать мое async введение и дополнить мой пост. на удалении async и await. TL;DR: используйте async/await по умолчанию и пропускайте их только в том случае, если метод является простым сквозным методом. Поскольку ваш пример не является простым сквозным методом, вы должны сохранить ключевые слова async/await.

Также важно проводить различие между асинхронным и async. Существует несколько видов асинхронного кода, тогда как async — это деталь реализации — один конкретный вид асинхронного кода. Оба метода в вашем вопросе асинхронны, но только один использует async.

Они также говорят, что ограничение использования async и await может улучшить производительность и использование оперативной памяти.

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

Можете ли вы использовать .Result или нам лучше использовать async/await. Потому что я слышал, что .Result блокирует текущий поток.

По возможности следует использовать async/await и избегать Result , даже в ASP.NET Core.

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

Тема не заблокирована. await работает, вставляя закладку в метод и затем возвращая результат. Таким образом, поток не блокируется, но вы можете думать о методе как о приостановленном. https://blog.stephencleary.com/2012/02/async-and-await.html

22.04.2021
Новые материалы

Я собираюсь научить вас Python шаг за шагом
Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

React on Rails
Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

Что такое гибкие методологии разработки программного обеспечения
Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

Ториго  — революция в игре Го
Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

Математика и интуиция - Часть 1
У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..