В asp.net Web API, как можно асинхронно вызывать длительные блокирующие действия?Асинхронные вызовы в Web Api
У меня есть действие контроллера веб-api, которое должно сделать относительно (10 секунд, как пример) длительный вызов БД. Это похоже на кандидата для асинхронного метода. Я могу разгрузить долго выполняющиеся задачи на новую нить, и разблокирование моего запроса asp.net потока для обработки некоторых других запросов, так что мой упрощена действие контроллера будет выглядеть следующим образом:
public async Task<IHttpActionResult> Get()
{
IEnumerable<Thing> things = await Task.Run(() => DoLongDbCall());
return Ok(things);
}
Я сталкивался парой блог (this one, например), которые предполагают, что это не может быть оптимальным способом достижения этого в asp.net. Автор предлагает использовать Task.FromResult()
и выполнять вызов БД синхронно, но я не вижу, как это помогает; Моя очередь запросов по-прежнему будет заблокирована, ожидая возврата вызова БД.
Все запросы уже выполняются в отдельном потоке, поэтому вам не нужно блокировать, если вы не хотите выполнять два или более вызова параллельно. Вызов 'await Task.Run' просто * отнимает * другой поток, когда вы можете использовать исходный поток. –
Вы понимаете, что в этом сценарии использование 'async' /' await' действительно не дает вам ничего? – James
ADO.NET * и * EF * do * поддерживают асинхронные вызовы. 'DoLongDbCall' должен сам быть асинхронным методом. В этом случае вы будете освобождать текущий поток, ожидая базы данных * без *, используя дополнительный поток, чтобы ждать –