【问题标题】:ASP.Net multithreaded web service callsASP.Net 多线程 Web 服务调用
【发布时间】:2012-01-06 09:22:55
【问题描述】:

我有以下场景:

我们有一个生成 PDF 报告的 ASP.Net 网站。要生成 PDF 报告,我们需要进行多次 Web 服务调用(每次调用都会返回一部分数据)。大多数调用都指向同一个端点,但方法和参数不同。为了提高性能,我们想到了以下两种方法:

  1. 公开一个接受所有单独调用参数的 Web 服务操作。在内部,这个方法一个一个地调用每个方法;完成后,它将所有响应打包到一个集合中并将其发回。然后 ASP.Net 网页接收响应列表并将其解包并生成报告。
  2. 从 ASP.Net 应用程序并行调用 Web 服务方法。完成所有并行调用后,收集所有响应并生成 PDF。

起初,第二种方法看起来很优雅;问题是,我们如何进行并行 Web 服务调用。 Thread.QueueUserWorkItem 不是这里建议的好选择: Using ThreadPool.QueueUserWorkItem in ASP.NET in a high traffic scenariohttp://williablog.net/williablog/category/Scalability.aspx

使用 new Thread() 创建新线程也不是很好,正如这里建议的那样: http://blogs.msdn.com/b/tmarq/archive/2010/04/14/performing-asynchronous-work-or-tasks-in-asp-net-applications.aspx

此外,Web 应用程序代码由 UI 和调用 Web 服务方法的业务逻辑层分层。该站点不是一个负载很重的站点,大约有 200 个并发用户。

请求帮助提出改进 pdf 生成过程性能的建议。

感谢和问候

维卡斯

【问题讨论】:

  • 据我所知,生成的 web 服务客户端类会生成 web 服务调用的异步版本。您是否尝试过使用这些而不是采用多线程方式?

标签: asp.net multithreading parallel-processing


【解决方案1】:

link,它是为了尊重并行编程(一种多线程解决方案)和异步编程。 (对于 CPU 密集型解决方案使用并行编程。对于 IO Bound 解决方案使用异步编程。)

如果你想使用线程,你可以使用parallel.foreach 或这个模型:

 foreach (var item in Clients)
{
                Tasks.Add(Task.Run(() =>
                    {
                    Result.AddRange(item.GetPoint(MasterLogId, mobileNumber));                  
                }
  }

但是,异步编程它是调用 Web 服务(对于许多请求)的好解决方案,因为调用 Web 服务是 i/o 绑定的!如果您使用线程,您将运行许多线程,所有线程都在等待调用(待定 io)。 最后,see my same problem and best answers

【讨论】:

    【解决方案2】:

    看看Asynchronous Pages in ASP.NET 从本质上讲,它允许您执行选项#2 中的建议,但使用 ASP.NET 中内置的机制,而不必利用较低级别的线程技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多