Какая польза от Task с асинхронностью?

Что, если я не использую Task в асинхронном методе? Я много искал, но смог понять, почему мы используем Task с async. Пожалуйста, предложите какой-то момент, так как оба асинхронно. Спасибо заранее.

Пример подписи asyncTask:

//Controller with async and task 
public async Task<IActionResult> CreateNewBug([FromBody] BugTrackerRequest bugTrackerRequest)
{
   if (ModelState.IsValid)
   {
        var Request = await _projectDetails.CreateNewBug(bugTrackerRequest);
        if (Request > 0)
        {
           return Ok("Success");
        }
    }

   return StatusCode(500, new { Message = "Something went wrong" });
}

Пожалуйста, приложите достаточно усилий, чтобы код можно было прочитать. Кроме того, вы ставите enter code here и **strong text** в случайных местах, пожалуйста, избавьтесь от них тоже. И вообще, не совсем понятно, о чем вы спрашиваете.

Camilo Terevinto 26.12.2020 18:13

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

dks 26.12.2020 18:22

Все в порядке, вы всегда можете отредактировать свой вопрос, чтобы улучшить его.

Camilo Terevinto 26.12.2020 18:22
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
455
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Что, если я не использую Task в асинхронном методе?

Ну это по дизайну.

Если вы хотите использовать async, у вас есть ограниченный набор допустимых типов возврата*:

  • void
  • Task
  • Task<T>
  • task-like type
  • IAsyncEnumerable<T>
  • IAsyncEnumerator<T>

* leaving out lambda's and anonomyous methods here.

Все остальное недействительно. И void считается плохой практикой.

Например.:

public async int DoIt()

вызовет эту ошибку:

Ошибка CS1983. Тип возвращаемого значения асинхронного метода должен быть void, Task, Task, типом, подобным задаче, IAsyncEnumerable или IAsyncEnumerator.

Кроме того, модификатор async сам по себе мало что делает. Я считаю, что это общее заблуждение.

Это не делает ваш код «асинхронным». Это комбинация задач вместе с ключевым словом await, которая позволяет вам выполнять задачу асинхронно, но при этом продолжать последующую работу — и для этого предназначена конструкция async/await.

Я настоятельно рекомендую вам прочитать MR. Блог Клири на эту тему:

https://blog.stephencleary.com/2012/02/async-and-await.html

Как он заявляет:

Ключевое слово «async» включает ключевое слово «await» в этом методе и изменяет способ обработки результатов метода. Это все, что делает ключевое слово async! Он не запускает этот метод в потоке пула потоков и не выполняет какую-либо другую магию. Ключевое слово async включает только ключевое слово await (и управляет результатами метода).


Как в комментарии: вам нужна асинхронность только в том случае, если вы хотите использовать ожидание. Вы используете await только в том случае, если вам нужно что-то сделать после асинхронного метода.

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

Некоторые примеры:

// no async, yet possibly asynchronous.
// Task can be returned directly, it's still asynchronous.
public Task<int> ProcessData()
{
   return _dbContext.SaveChangesAsync();
}
// no async, yet possibly asynchronous.
// returning the task directly
public async Task<int> ProcessData()
{
   var result = await _dbContext.SaveChangesAsync();
   //await needed if you want to continue here after the task is completed.
   if (result < 1)
       throw new ValidationException("should be higher then 1");

   return result;   
}

Следующие 2 примера ничего не добавляют и/или недействительны:

// returning the task directly
public Task<int> ProcessData()
{
   //ERROR: missing async keyword
   var result = await _dbContext.SaveChangesAsync(); 
   return result;   
}
// returning the task directly
public async Task<int> ProcessData() //WARNING: missing await keyword
{
   //WARNING: missing await keyword
   return _dbContext.SaveChangesAsync(); 
}

То есть вы хотите сказать, что если я использую асинхронность, то для получения вывода нужно использовать задачу, и это хорошая практика, верно? .....Спасибо!!

dks 26.12.2020 18:27

По сути: вам нужно только async, если вы хотите использовать await. Вы используете await только в том случае, если вам нужно что-то сделать после асинхронного метода.

Stefan 26.12.2020 18:29

Другие вопросы по теме