放置几个HTTP请求以等待相同的I / O完成端口

时间:2011-11-28 17:17:17

标签: asp.net iis iocp iasyncresult io-completion-ports

我的应用程序异步加载来自Web服务和“Application_Start”的大量信息。

如果用户请求想要使用该信息,并且它还没有准备就绪,则该线程将被阻止,并带有Monitor.Wait。当信息准备好后,缓存对象将Monitor.Pulse所有等待的线程。这应该没问题,因为信息需要十几秒钟,用户必须重定向到登录页面,发布登录信息,然后再次重定向。

问题是,Monitor.Wait将阻止CLR ThreadPool线程,据我所知,如果请求突发请求“大信息”,应用程序可能会被CLR ThreadPool饥饿阻止(我有当前的IIS / ASP.NET线程选通有点混乱。

由于大部分信息来自我异步调用的Web服务,因此我拥有该操作的IAsyncResult。

那么,有没有办法告诉CLR ThreadPool线程“等待这个IOCP”,所以线程池线程可以开始参加其他调用了吗?

我觉得这个问题没有得到很好的解释,如果不清楚我在问什么,请告诉我。

问候。

PS:虽然赏金已经结束,但如果有人知道如何做到这一点,我会提出一个新的并授予作者。

2 个答案:

答案 0 :(得分:2)

这是一个很好的问题。我的经验是,你试图干扰ASP.NET内部的更多因为你造成的痛苦。

您是否考虑过使用serviceAutoStartProviders来保持应用热销?

ASP.NET 4.0: How to use application warm-up class

答案 1 :(得分:0)

您应该使用IHttpAsyncHandler来返回缓慢加载的大数据。 Walkthrough: Creating an Asynchronous HTTP Handler

  

在处理异步HTTP处理程序期间,ASP.NET 放置   通常用于外部进程的线程   进入线程池,直到处理程序从中接收回调   外部流程。这可以防止线程阻塞和改进   性能,因为只能执行有限数量的线程   在同一时间。

IHttpAsyncHandler返回12秒钟应该没问题。事实上,你应该可以轻松地上升到大约60秒,而不用担心。除此之外,您可能需要实现某种类型的long-polling 系统来监控系统状态。

IHttpAsyncHandler可以返回XML / JSON或任何你喜欢的内容。如果你想使用HttpWebRequest(一些示例C#代码:jQuery.ajax),你可以通过javascript中的ajax(可能是Calling remote JSON webservice)甚至服务器端来使用IHttpAsyncHandler。