#c# #.net-core #async-await
#c# #.net-ядро #асинхронное ожидание
Вопрос:
Я искал некоторую информацию по этой теме, так как сейчас я немного смущен проблемами и преимуществами использования этого подхода внутри асинхронного API.
Я разрабатываю API с методами распознавания, которые потребляют довольно много ресурсов и требуют некоторого времени для завершения обработки.
Прямо сейчас я использую следующий подход для выполнения петиции, в которой я отправляю изображение билета и возвращаю объект со всей связанной с ним информацией. Как вы можете видеть, я использую Task.Run()
для выполнения обработки распознавания и, следовательно, выполнения асинхронного вызова
public async Task<ActionResult<object>> GetTicketData([FromBody] PostTicketRequest ticket)
{
try
{
using (var Extractor = new TicketExtractor())
{
return await Task.Run(() => Extractor.ExtractTicketData(ticket.data));
}
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
Я хотел бы знать, является ли это хорошим способом выполнения этого процесса, поскольку я относительно новичок в разработке API, и меня беспокоит производительность и масштабируемость.
РЕДАКТИРОВАТЬ: после прочтения сообщения, предоставленного Джонатаном, похоже, что это правильный способ приблизиться к нему
public ActionResult<object> GetTicketData([FromBody] PostTicketRequest ticket)
{
try
{
using (var Extractor = new TicketExtractor())
{
return Extractor.ExtractTicketData(ticket.data);
}
}
catch (Exception ex)
{
return BadRequest(ex);
}
}
Комментарии:
1. Это плохая идея для использования
Task.Run
в API. Если метод по своей сути является синхронным, предоставьте его как таковой и разрешите вызывающей стороне выгрузить операцию в пул потоков, если это то, что они хотят сделать.2. blog.stephencleary.com/2013/11/…
3. Спасибо @JohnathanBarclay за ваш быстрый ответ, этот пост действительно очень полезен!
4. Это также актуально: должен ли я предоставлять асинхронные оболочки для синхронных методов?
5. Спасибо!! @TheodorZoulias Я тоже дам ему прочитать