Почему мой асинхронный метод не возвращает поток в пул потоков? - PullRequest
0 голосов
/ 22 сентября 2019

Я экспериментирую с шаблоном async / await и создал простой API-интерфейс ASP.NET.

В Startup.cs я установил число потоков равным 2:

ThreadPool.SetMinThreads(2, 2);
ThreadPool.SetMaxThreads(2, 2);

У меня есть контроллер, который вставляет 500 000 объектов в базу данных в памяти.В этом контроллере также есть метод поиска объекта по GUID:

private void InitialiseDatabase()
{
    _context.Items.Add(new Item {
        Id = Guid.Parse("4ffc6ac9-b2ce-4323-8dc2-5a763ed23f2e") });

    for (int i = 0; i < 500_000; i++)
    {
        _context.Items.Add(new Item { Id = Guid.NewGuid() });
    }

    _context.SaveChanges();
}

[HttpGet("{id}")]
public async Task<ActionResult<Item>> GetItemAsync(Guid id)
{
    var item = await _context.Items.FindAsync(id);

    if (item == null)
    {
        return NotFound();
    }

    return item;
}

Чтобы проверить, как работает асинхронность, я отправляю два запроса почтальона на несуществующие элементы.Каждый из них занимает около 20 секунд.Пока они выполняются, я отправляю запрос на существующий элемент, который должен занимать доли секунды.

Насколько я понимаю, когда нажимается ключевое слово await, управление передается вызывающему коду, иесли это на уровне контроллера, то поток возвращается в пул потоков для повторного использования.

Похоже, что это не так, третий запрос обрабатывается только один раз из долго выполняющегосязапросы выполнены.

Возможно, я неправильно понял, как работает асинхронность в ASP.NET.

...