1

我在我的网站上执行了一项操作,要求我检查多个 Web 服务器并汇总结果。目前,这是针对每个 Web 服务器同步完成的foreach,这可能会很慢,具体取决于 Web 服务器的响应速度。

我想做的是异步请求每个请求,并在所有结果全部完成时聚合所有结果。

我的问题是 - 使用 ASP.NET Webforms,最好的方法是什么?有什么我应该避免的吗?

每个请求可能需要 2 秒,所以我想同时将它们全部关闭。

4

3 回答 3

2

这听起来像是对“标准”异步 IO或“标准”线程 IO的一种很好的照顾。

WhereT代表{time1, time2, ..},这将做出响应,O(max(T))而不是O(sum(T))- 假设没有顺序依赖或其他瓶颈。

这可以使用任何一个来完成

异步 IO - IO 不会阻塞线程

同步 IO,但线程化- IO 确实阻塞了单个线程

  • .NET4 中的 TPL
  • 或“旧手动”线程/池(链接的帖子具有相同的“要求”)

使用的 .NET 版本和可用于获取外部数据的 API 是决定哪种方法[更]合适的因素。

于 2012-10-23T19:36:39.687 回答
0

我会使用 jQuery 对服务器进行异步 AJAX 调用。但是,我会使用 ashx 处理程序而不是 WebForm 来处理服务器上的 AJAX 调用并将数据发送回客户端;ashx 处理程序比 WebForms 更轻量级。这是编写 ASHX 处理程序的快速教程http://www.dotnetperls.com/ashx 这对您有帮助吗?

于 2012-10-23T19:13:28.903 回答
0

如果您使用的是 .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 等来获取结果,以对从方法调用获得的结果执行逻辑。

于 2012-10-23T19:39:33.377 回答