Как исчерпать рабочие потоки ASP.NET, чтобы показать важность асинхронного шаблона ожидания - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь доказать младшему важность асинхронного программирования, используя 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 секунд.

...