Изучив концепцию асинхронной веб-разработки, в частности из этого источника, я создал пример приложения для доказательства концепции.
Решение состоит из двух приложений 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" } };
}
Вот класс ученика:
public class Student
{
public string Name { get; set; }
}
Эта конечная точка размещена в IIS 7 на localhost: 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 на localhost: 4001.
Обе конечные точки работают, как ожидалось, и возвращаются в ок. 1 секунда. Основываясь на видео в ссылке выше в 13:25, асинхронный метод должен освободить его Thread, сводя к минимуму конкуренцию.
Я запускаю тесты производительности приложения с помощью Apache Bench. Вот время отклика синхронного метода с 10 одновременными запросами:
Это так, как я ожидал; более параллельные соединения увеличивают конфликт и продлевают время отклика. Однако здесь есть время асинхронного ответа:
Как вы можете видеть, все еще кажется, что некоторые споры. Я ожидал, что среднее время отклика будет более сбалансированным. Если я запускаю тесты на обеих конечных точках с 50 одновременными запросами, я все равно получаю аналогичные результаты.
На основании этого кажется, что оба асинхронных и синхронных метода работают с большей или меньшей скоростью (ожидается), не принимая во внимание накладные расходы в асинхронных методах, но также и то, что асинхронный метод, похоже, не является освобождая потоки обратно в ThreadPool. Я бы приветствовал любые комментарии или пояснения, спасибо.