我的应用程序异步加载来自Web服务和“Application_Start”的大量信息。
如果用户请求想要使用该信息,并且它还没有准备就绪,则该线程将被阻止,并带有Monitor.Wait。当信息准备好后,缓存对象将Monitor.Pulse所有等待的线程。这应该没问题,因为信息需要十几秒钟,用户必须重定向到登录页面,发布登录信息,然后再次重定向。
问题是,Monitor.Wait将阻止CLR ThreadPool线程,据我所知,如果请求突发请求“大信息”,应用程序可能会被CLR ThreadPool饥饿阻止(我有当前的IIS / ASP.NET线程选通有点混乱。
由于大部分信息来自我异步调用的Web服务,因此我拥有该操作的IAsyncResult。
那么,有没有办法告诉CLR ThreadPool线程“等待这个IOCP”,所以线程池线程可以开始参加其他调用了吗?
我觉得这个问题没有得到很好的解释,如果不清楚我在问什么,请告诉我。
问候。
PS:虽然赏金已经结束,但如果有人知道如何做到这一点,我会提出一个新的并授予作者。答案 0 :(得分:2)
这是一个很好的问题。我的经验是,你试图干扰ASP.NET内部的更多因为你造成的痛苦。
您是否考虑过使用serviceAutoStartProviders
来保持应用热销?
答案 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。