我在我的网站上执行了一项操作,要求我检查多个 Web 服务器并汇总结果。目前,这是针对每个 Web 服务器同步完成的foreach
,这可能会很慢,具体取决于 Web 服务器的响应速度。
我想做的是异步请求每个请求,并在所有结果全部完成时聚合所有结果。
我的问题是 - 使用 ASP.NET Webforms,最好的方法是什么?有什么我应该避免的吗?
每个请求可能需要 2 秒,所以我想同时将它们全部关闭。
我在我的网站上执行了一项操作,要求我检查多个 Web 服务器并汇总结果。目前,这是针对每个 Web 服务器同步完成的foreach
,这可能会很慢,具体取决于 Web 服务器的响应速度。
我想做的是异步请求每个请求,并在所有结果全部完成时聚合所有结果。
我的问题是 - 使用 ASP.NET Webforms,最好的方法是什么?有什么我应该避免的吗?
每个请求可能需要 2 秒,所以我想同时将它们全部关闭。
这听起来像是对“标准”异步 IO或“标准”线程 IO的一种很好的照顾。
WhereT
代表{time1, time2, ..}
,这将做出响应,O(max(T))
而不是O(sum(T))
- 假设没有顺序依赖或其他瓶颈。
这可以使用任何一个来完成
异步 IO - IO 不会阻塞线程
或同步 IO,但线程化- IO 确实阻塞了单个线程
使用的 .NET 版本和可用于获取外部数据的 API 是决定哪种方法[更]合适的因素。
我会使用 jQuery 对服务器进行异步 AJAX 调用。但是,我会使用 ashx 处理程序而不是 WebForm 来处理服务器上的 AJAX 调用并将数据发送回客户端;ashx 处理程序比 WebForms 更轻量级。这是编写 ASHX 处理程序的快速教程http://www.dotnetperls.com/ashx 这对您有帮助吗?
如果您使用的是 .NET Framework 4,则可以使用 Task 并行库来实现这一点。假设GetDataFromServer
您必须为不同的服务器调用该方法,您可以执行类似于以下逻辑的一段逻辑来从所有服务器获取数据:
var d1 = Task.Factory.StartNew(() => GetDataFromServer("server1"));
var d2 = Task.Factory.StartNew(() => GetDataFromServer("server2"));
var d3 = Task.Factory.StartNew(() => GetDataFromServer("server3"));
var d4 = Task.Factory.StartNew(() => GetDataFromServer("server4"));
TaskCoordinator.WhenAll(new Task[] {d1, d2, d3, d4});
上述步骤异步调用所有四个方法。它将等待所有这些都完成。每个操作的结果存储在Result
相应Task
对象的属性中。因此,您可以使用 d1.Result、d2.Result 等来获取结果,以对从方法调用获得的结果执行逻辑。