Я использую asp.net Web API 2 и Entity Framework 6.асинхронной ждут вызова долго выполняющиеся синхронной и асинхронной методы
Оригинальный псевдокод
public IHttpActionResult GetProductLabel(int productId)
{
var productDetails = repository.GetProductDetails(productId);
var label = labelCalculator.Render(productDetails);
return Ok(label);
}
Модифицированный код
public async Task<IHttpActionResult> GetProductLabel(int productId)
{
var productDetails = await repository.GetProductDetailsAsync(productId); // 1 long second as this call goes into sub services
var label = labelCalculator.Render(productDetails); // 1.5 seconds synchrounous code
return Ok(label);
}
Перед моим изменением все шло синхронно.
После моего изменения вызов удаленной службы, которая снова вызывает базу данных, выполняется асинхронно.
Затем я делаю вызов синхронизации в библиотеку рендеринга, которая предлагает только методы синхронизации. Расчет занимает 1,5 секунды.
Есть ли еще какая-то польза от удаленной службы database_service, вызывающей вызов async-await, но второй вызов нет? И есть ли что-нибудь, что я мог бы еще улучшить?
Примечание
Причина, почему я спрашиваю это потому, что:
«С контроллерами асинхронными, когда процесс ожидает ввода/вывода для завершения, ее поток освобождается для сервера в использовать для обработки других запросов ».
Итак, когда первый удаленный вызов database_service обрабатывается и ожидает этого 1 секунду, поток возвращается в IIS ?? !!
Но как насчет расчета 2-й метки, составляющей 1,5 секунды, которая снова заблокирует текущую нить в течение 1,5 секунд?
Итак, я освобождаю и блокирую поток, что не имеет смысла или что вы думаете?
Вы не используете 'Task.FromResult', если у вас есть' async', просто выполните 'return label;' вы имели в виду не использовать async/wait в первом примере? –
Я знаю ... поэтому я представил вам «модифицированный код», который вы предлагаете сейчас. – Pascal