【发布时间】:2015-10-27 15:16:59
【问题描述】:
我使用 MvvmCross 和 Stephen Cleary 出色的 AsyncEx 库创建了一个 Windows 10 通用应用程序。
更新 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 秒才能完成,即使每个方法调用都在做同样的事情。
我的问题是:为什么会这样?
任务 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:52 开始
任务 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 开始于 20/10/2015 15:09:53
任务 ID 1050100111000000000034373 于 20/10/2015 15:09:53 结束
任务 ID 1050100111000000000034514 于 20/10/2015 15:09:53 开始
任务 ID 1050100111000000000034512 于 20/10/2015 15:09:53 结束
任务 ID 1050100111000000000034514 于 20/10/2015 15:09:53 结束
任务 ID 1050100111000000000034402 于 20/10/2015 15:09:53 结束
任务 ID 1050100111000000000034407 于 20/10/2015 15:09:54 结束
任务 ID 1050100111000000000034398 于 20/10/2015 15:09:54 结束
任务 ID 1050100111000000000034483 于 20/10/2015 15:09:55 结束
任务 ID 1050100111000000000034479 于 20/10/2015 15:09:55 结束
任务 ID 1050100111000000000034488 于 20/10/2015 15:09:56 结束
任务 ID 1050100111000000000034454 于 20/10/2015 15:09:56 结束
任务 ID 1050100111000000000034433 于 20/10/2015 15:09:57 结束
任务 ID 1050100111000000000034431 于 20/10/2015 15:09:57 结束
如果我使用假数据(而不是完全调用 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。
【问题讨论】:
-
最好分享一段repro代码,尤其是这里,因为它涉及到客户端和服务器。 IIS 通常不会对请求进行排队。
标签: c# iis async-await windows-10