在研究了异步 Web 开发的概念之后,特别是从这个来源,我创建了一个示例应用程序来证明这个概念。
该解决方案由 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" } };
}
这是学生课:
public class Student
{
public string Name { get; set; }
}
此端点托管在 localhost:4002 上的 IIS 7 中。
第二个应用程序使用 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());
}
它托管在 localhost:4001 上的 IIS 7 中。
两个端点都按预期工作,并在大约返回。1秒。根据 13:25 上面链接中的视频,异步方法应该释放它的线程,最大限度地减少争用。
我正在使用 Apache Bench 对应用程序进行性能测试。以下是具有 10 个并发请求的同步方法的响应时间:
这和我预期的差不多;更多的并发连接会增加争用并延长响应时间。但是,这里是异步响应时间:
如您所见,似乎仍然存在一些争论。我本来预计平均响应时间会更加平衡。如果我在两个端点上运行 50 个并发请求的测试,我仍然会得到类似的结果。
基于此,似乎异步和同步方法都以或多或少相同的速度运行(预期),不考虑异步方法的开销,而且异步方法似乎没有释放线程回来到线程池。我欢迎任何评论或澄清,谢谢。