Я пытаюсь доказать младшему важность асинхронного программирования, используя async
и await
. Для этой цели я создал проект ASP.NET Web API с одним контроллером и двумя действиями GET. Одно действие GET является синхронным, а другое - асинхронным. Я хочу продемонстрировать, что в случае синхронного блокирующего вызова ввода-вывода все доступные рабочие потоки ASP.NET ждут и не делают ничего полезного, а в то же время, когда приходит еще несколько запросов, они истекают, так как все доступные потоки ожидание завершения потоков ввода / вывода. Проблема в том, что мой фрагмент кода ниже передает смысл. это работает как предназначено в случае асинхронных вызовов, но не для синхронных вызовов. Если я раскомментирую закомментированные строки кода, этого не произойдет, и среда выполнения ASP.NET сможет справиться со многими другими потоками. Фрагмент кода ниже:
public class TestController : ApiController
{
// -> Uncommenting the below method proves my point of scalability <-
//public async Task<string> Get()
//{
// CodeHolder obj = new CodeHolder();
// return await obj.AsyncData();
//}
// -> Uncommenting the below method doesn't enforce time outs, rather waits <-
public string Get()
{
CodeHolder obj = new CodeHolder();
return obj.SyncData();
}
}
class CodeHolder
{
public string SyncData()
{
Task.Delay(10000).Wait();
return $"I am returned from Sync after waiting for 10 second at {DateTime.Now.ToString("HH:mm:ss:fffffff")}";
}
public async Task<string> AsyncData()
{
await System.Threading.Tasks.Task.Delay(10000);
return $"I am returned from Async after semi-waiting for 10 second at {DateTime.Now.ToString("HH:mm:ss:fffffff")}";
}
}
Хотя мысль, которую я пытался предложить, передается, поскольку синхронные вызовы требуют много времени, но мне интересно, почему запросы хранятся в очереди, а не в тайм-аутах. Я использую JMeter для отправки 250 одновременных HTTP-запросов в мою службу Web API, но они никогда не заканчиваются, скорее они продолжают ждать и завершать, хотя и очень большая задержка ( ~ 250 секунд ).
Кстати, в асинхронной версии все ответы возвращаются примерно через 10 секунд.