【问题标题】:Calling multiple server actions asynchronously in webforms在 Web 表单中异步调用多个服务器操作
【发布时间】:2012-10-24 03:51:50
【问题描述】:

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

我喜欢做的是异步每个请求,并在所有结果都完成时聚合所有结果。

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

每个请求可能需要 2 秒,所以我想同时启动它们。

【问题讨论】:

  • 您使用的是哪个版本的 ASP.NET?
  • @JohnSaunders 如果您可以访问 .NET 4.5,那就更容易了,因此是 Kiran 的评论。
  • @JohnSaunders 这似乎与“让它更快”没有任何关系 :( 这个问题似乎更适合 TPL 或类似的并行性,不一定跨请求(例如减少 other 负载下的响应时间)。

标签: c# asp.net asynchronous webforms


【解决方案1】:

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

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

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

异步 IO - 其中 IO 不会阻塞线程

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

  • .NET4 中的 TPL
  • 或“旧手册”threading/pooling(链接的帖子具有相同的“要求”)

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

【讨论】:

  • 我想我会选择 async/await 模式——这似乎是最好的选择!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果您使用的是 .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});
    

    上述步骤异步调用所有四个方法。它将等待所有这些都完成。每个操作的结果存储在对应的Task 对象的Result 属性中。因此,您可以使用 d1.Result、d2.Result 等来获取结果,以对从方法调用获得的结果执行您的逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-15
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多