我使用MvvmCross和Stephen Cleary优秀的AsyncEx库创建了一个Windows 10 Universal App。
更新27/10/2015 15:43 - 斯蒂芬回答了这个问题。经过测试并证明是正确的。
在视图中,我将ListView绑定到ViewModel中的一个属性,该属性异步加载一个名为AssignableTaskPlaceholderViewModel的占位符视图模型集合(使用AsyncEx功能)。
数据来自我也创建的Web API服务。 对于我的测试工具,该集合加载了12个AssignableTaskPlaceholderViewModel,每个都只保存一个ID值。
然后,ListView项的DataTemplate将元素绑定到AssignableTaskPlaceholderViewModel上名为AssignableTaskViewModel的属性。这异步调用另一个Web API方法来返回详细数据(再次使用AsyncEx功能)。此方法当前正在返回模拟数据。
当我运行应用程序时,我希望看到:
1)占位符集合的初始加载需要花费少量时间,然后
2)列表中每个项目的详细数据同时,大约花费相同的时间来加载数据。
我实际看到的是正在加载的详细数据顺序,即看起来IIS正在对请求进行排队,一次处理一个请求。
下面显示的是一些调试数据,它显示初始请求在一秒内处理,响应需要0到4秒才能完成,即使每个方法调用都在做同样的事情。
我的问题是:为什么会发生这种情况?
在20/10/2015 15:09:52开始执行任务ID 1050100111000000000034373
在20/10/2015 15:09:52开始执行任务ID 1050100111000000000034398
在20/10/2015 15:09:52开始执行任务ID 1050100111000000000034402
在20/10/2015 15:09:52开始执行任务ID 1050100111000000000034407
20/10/2015 15:09:53开始执行任务ID 1050100111000000000034431
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034433
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034454
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034479
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034483
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034488
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034512
2015年10月20日15:09:53结束任务ID 1050100111000000000034373
在20/10/2015 15:09:53开始执行任务ID 1050100111000000000034514
2015年10月20日15:09:53结束任务ID 1050100111000000000034512
2015年10月20日15:09:53结束任务ID 1050100111000000000034514
2015年10月20日15:09:53结束任务ID 1050100111000000000034402
2015年10月20日15:09:54结束任务ID 1050100111000000000034407
2015年10月20日15:09:54结束任务ID 1050100111000000000034398
20/10/2015 15:09:55结束任务ID 1050100111000000000034483
2015年10月20日15:09:55结束任务ID 1050100111000000000034479
2015年10月20日15:09:56结束任务ID 1050100111000000000034488
2015年10月20日15:09:56结束任务ID 1050100111000000000034454
在20/10/2015 15:09:57结束任务ID 1050100111000000000034433
在20/10/2015 15:09:57结束任务ID 1050100111000000000034431
如果我使用假数据(而不是完全调用Web API方法),故意添加延迟,我可以看到View / ViewModel / AsyncEx管道工作正常。
更多详情:
1)我正在使用 Windows.Web.Http.HttpClient 调用Web API。我为所有Web API方法调用使用了一个HttpClient实例(我认为这是最佳实践)。
2)Web API方法调用不需要身份验证或HTTPS连接。
3)对于HttpBaseProtocolFilter(用于HTTPClient),我将MaxConnectionsPerServer设置为100。
4)Web API项目的目标是.Net 4.6(targetFramework =" 4.6")。我相信这个版本的.Net并不限制与服务器的连接数,即无需将其添加到web.config :.
5)我在客户端应用程序和Web API方法中都“一直”使用Async / Await。
6)在Web API项目中启用了会话。
7)我在Win 10开发PC上运行IIS 10.
答案 0 :(得分:2)
如果启用了读/写会话模式,则ASP.NET将序列化请求。无论是同步还是异步,ASP.NET都会这样做。