Я экспериментирую с шаблоном 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.