Что, если я не использую Task в асинхронном методе? Я много искал, но смог понять, почему мы используем Task
с async
. Пожалуйста, предложите какой-то момент, так как оба асинхронно. Спасибо заранее.
Пример подписи async
Task
:
//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" });
}
@Camilo извините за неудобства, в следующий раз возникнут проблемы с набором текста, позаботимся о том же.
Все в порядке, вы всегда можете отредактировать свой вопрос, чтобы улучшить его.
Что, если я не использую 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();
}
То есть вы хотите сказать, что если я использую асинхронность, то для получения вывода нужно использовать задачу, и это хорошая практика, верно? .....Спасибо!!
По сути: вам нужно только async
, если вы хотите использовать await
. Вы используете await
только в том случае, если вам нужно что-то сделать после асинхронного метода.
Пожалуйста, приложите достаточно усилий, чтобы код можно было прочитать. Кроме того, вы ставите
enter code here
и**strong text**
в случайных местах, пожалуйста, избавьтесь от них тоже. И вообще, не совсем понятно, о чем вы спрашиваете.