2011-11-25 109 views
1

我有以下情形:ASP.Net多线程Web服务调用

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

  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

创建使用新主题(新线),也没有伟大的,因为这里建议: 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生成过程的性能。

感谢和问候

维卡斯

+1

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

回答

0

Asynchronous Pages in ASP.NET看看它在本质上可以让你做你的选项#2,但内置到ASP.NET,而不必机制有什么建议挖掘更低层次的线程技术。

0

看到这个link,它的并行编程(多种解决方案)和异步编程。如果你想使用线程,你可以使用parallel.foreach(使用CPU密集型解决方案并行编程使用的IO绑定解决方案异步编程。)

或该型号:

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