繁体   English   中英

如何在ASP.NET中等待异步Web服务调用的结果以获得最佳性能

[英]How to wait for result of asynchronous web service call in ASP.NET for best performance

在WebForms ASP.NET站点(IIS,单个应用程序池)中,我调用了Visual Studio中引用的冗长Web服务方法作为服务引用(.NET 4.0)。 不幸的是,在向用户提供页面之前,我必须等待来自Web服务的信息。 当前Web服务是同步调用的,因此服务器无法重用当前线程来处理对性能有影响的其他请求。

当然我可以在Visual Studio中为服务引用生成异步操作并调用BeginGetFoo而不是GetFoo ,但我仍然必须等待来自Web服务的结果。

这是个问题。 如果我使用AsyncWaitHandle.WaitOne (如下所示),那么我今天使用的同步调用的整个应用程序性能条件会更好吗?

IAsyncResult result = fooSoapClient.BeginGetFoo();
result.AsyncWaitHandle.WaitOne();
var foo = fooSoapClient.EndGetFoo(result);

当然,如果等待可以做得更好,我愿意接受建议。

您想使用异步页面。 请参阅“ Wicked Code:ASP.NET中使用异步编程的可伸缩应用程序 ”, 以及ASP.NET 2.0中的异步页面 ,它使用RegisterAsyncTask讨论Web服务和异步任务。

你仍然在忙着线程。 “安全”选项是使用ASP.NET MVC的异步控制器: http//www.aaronstannard.com/post/2011/01/06/asynchonrous-controllers-ASPNET-mvc.aspx

但理想情况下,您不应该在Web请求上进行长时间运行。 有一个Windows服务或某事处理长时间运行的任务(可以通过Web请求启动消息队列中的某些内容或将任务放入数据库)并使用ajax或其他东西从客户端轮询,然后更新用户完成。

如果重构代码是不可接受的,那么你不能遵循@John Saunders的答案,那么你唯一能做的就是增加应用程序的线程数。 这将允许您更好地扩展,但在某些时候它会有收益递减,你将开始伤害性能。 更重要的是,如果您没有用户在请求队列上等待(即服务器上每个核心超过25个并发用户),则您不需要执行任何操作。 Web服务器中的异步编程仅对可伸缩性有帮助,但对单个用户的实际性能没有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM