Использование Task.Run() в асинхронных операциях

#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 Я тоже дам ему прочитать