ASP.Net多线程Web服务调用

时间:2011-11-25 13:49:38

标签: asp.net multithreading parallel-processing

我有以下情况:

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

  1. 公开接受所有单个呼叫参数的Web服务操作。在内部,此方法逐个调用每个方法;完成后,它将所有响应打包在一个集合中并发回。然后,ASP.Net网页接收响应列表并将其解压缩并生成报告。
  2. 从ASP.Net应用程序并行调用Web服务方法。完成所有并行呼叫后,收集所有响应并生成PDF。
  3. 首先,第二种方法看起来很优雅;问题是,我们如何进行并行Web服务调用。 Thread.QueueUserWorkItem不是一个很好的选择,如下所示: Using ThreadPool.QueueUserWorkItem in ASP.NET in a high traffic scenariohttp://williablog.net/williablog/category/Scalability.aspx

    使用新的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生成过程性能的建议。

    谢谢和问候

    维卡斯

2 个答案:

答案 0 :(得分:0)

看一下Asynchronous Pages in ASP.NET从本质上讲,它将允许你在选项#2中做你的建议,但是使用内置于ASP.NET的机制,而不是必须使用较低级别的线程技术。

答案 1 :(得分:0)

请参阅此link,了解并行编程(一种多线程解决方案)和异步编程。 (对CPU密集型解决方案使用并行编程。对IO绑定解决方案使用异步编程。)

如果您想使用线程,可以使用parallel.foreach或此模型:

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

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