Изучив концепцию асинхронной веб-разработки, в частности от источника this, я создал образец приложения, чтобы доказать концепцию.ASP.NET C# 5 Асинхронные веб-приложения с использованием Async & Await
Решение состоит из 2 приложений ASP.NET Web API. Первая - имитированная медленная конечная точка; он ждет 1000 мс перед возвратом список пользовательского класса под названием Student:
public IEnumerable<Student> Get()
{
Thread.Sleep(1000);
return new List<Student> { new Student { Name = @"Paul" }, new Student { Name = @"Steve" }, new Student { Name = @"Dave" }, new Student { Name = @"Sue" } };
}
Вот класс Student:
public class Student
{
public string Name { get; set; }
}
Эта конечная точка размещается в IIS 7 на локальном хосте: 4002.
Вторых контакты приложений первое использование 2 конечных точек, один синхронного, асинхронные с другой:
public IEnumerable<Student> Get() {
var proxy = WebRequest.Create(@"http://localhost:4002/api/values");
var response = proxy.GetResponse();
var reader = new StreamReader(response.GetResponseStream());
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
public async Task<IEnumerable<Student>> Get(int id) {
var proxy = new HttpClient();
var getStudents = proxy.GetStreamAsync(@"http://localhost:4002/api/values");
var stream = await getStudents;
var reader = new StreamReader(stream);
return JsonConvert.DeserializeObject<IEnumerable<Student>>(reader.ReadToEnd());
}
Это размещенные в IIS 7 на локальном хосте: 4001.
Оба оконечных устройства работают должным образом и возвращаются прибл. 1 секунда. Основываясь на видео в ссылке выше в 13:25, асинхронный метод должен освободить его Thread, сводя к минимуму конкуренцию.
Я выполняю тесты производительности приложения с помощью Apache Bench. Вот время отклика для синхронного метода с 10 одновременных запросов:
Это больше, чем я ожидал; более параллельные соединения увеличивают конфликт и продлевают время отклика. Однако, здесь асинхронное время отклика:
Как вы можете видеть, все еще кажется, что некоторые разногласия. Я ожидал, что среднее время отклика будет более сбалансированным. Если я запускаю тесты на обеих конечных точках с 50 одновременными запросами, я все равно получаю аналогичные результаты.
Исходя из этого, кажется, что оба асинхронных и синхронных метода работают с большей или меньшей скоростью (ожидается), не принимая во внимание накладные расходы в асинхронных методах, но также и то, что асинхронный метод не кажется выпустить Threads обратно в ThreadPool. Я бы приветствовал любые комментарии или пояснения, спасибо.
Самое большое изменение, которое вы получите, это когда ваши методы зависят от внешних источников, таких как база данных. – JustAnotherUserYouMayKnow
Спасибо, я бы подумал, что это было так для любого долговременного запроса, который я имитировал. Вы предполагаете, что асинхронная инфраструктура оптимизирована для запросов на основе IO, в отличие от привязки к процессору? Я изменю код, чтобы включить запрос базы данных. –
Точка async-framework - это выпуск Thread, когда ему нужно ждать ответа, поэтому он может позаботиться о другой работе. Это больше всего времени для запросов на основе ввода-вывода. Когда вы запрашиваете много данных из базы данных, каков должен быть поток? Подождите, пока данные вернутся ... Или вернитесь в threadpool тем временем и работайте над другим материалом, пока данные не вернутся? – JustAnotherUserYouMayKnow