我有以下情况:
我们有一个ASP.Net网站,可生成PDF报告。要生成PDF报告,我们需要进行多次Web服务调用(每次调用都会返回一部分数据)。大多数调用都是在同一个端点,但方法和参数不同。为了提高性能,我们考虑了以下两种方法:
首先,第二种方法看起来很优雅;问题是,我们如何进行并行Web服务调用。 Thread.QueueUserWorkItem不是一个很好的选择,如下所示: Using ThreadPool.QueueUserWorkItem in ASP.NET in a high traffic scenario和 http://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生成过程性能的建议。
谢谢和问候
维卡斯
答案 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。