Asp.net 放置多个HTTP请求以等待相同的I/O完成端口

Asp.net 放置多个HTTP请求以等待相同的I/O完成端口,asp.net,iis,iocp,iasyncresult,io-completion-ports,Asp.net,Iis,Iocp,Iasyncresult,Io Completion Ports,我的应用程序从web服务和“应用程序启动”异步加载大量信息 如果用户请求要使用该信息,但该信息尚未准备就绪,则线程将被Monitor.Wait阻塞。当信息准备就绪时,缓存对象将监视所有等待的线程。这应该没问题,因为信息需要十几秒钟,用户必须重定向到登录页面,发布登录信息,然后再次重定向 问题是Monitor.Wait会阻塞CLR线程池线程,据我所知,如果出现请求“大信息”的突发请求,应用程序可能仍然会被CLR线程池阻塞(我对当前的IIS/ASP.NET线程门控有点混乱) 由于大部分信息来自我异步

我的应用程序从web服务和“应用程序启动”异步加载大量信息

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

问题是Monitor.Wait会阻塞CLR线程池线程,据我所知,如果出现请求“大信息”的突发请求,应用程序可能仍然会被CLR线程池阻塞(我对当前的IIS/ASP.NET线程门控有点混乱)

由于大部分信息来自我异步调用的web服务,因此我得到了该操作的IAsyncResult

那么,有没有办法告诉CLR线程池线程“等待此IOCP”,以便线程池线程可以开始参加其他调用

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

问候


PS:虽然悬赏已经结束,但如果有人知道一种方法,我会提出一种新的方法,并授予作者。

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

您是否考虑过使用
ServiceAutoStart Providers
来保持应用程序的热度


您应该使用
IHttpAsyncHandler
返回缓慢加载的大数据。

在处理异步HTTP处理程序期间,ASP.NET将 通常用于返回外部进程的线程 直到处理程序收到来自线程池的回调为止 外部过程。这可以防止线程阻塞并提高性能 性能,因为只能执行有限数量的线程 同时,

IHTTPassynchandler
返回12秒应该没有问题。事实上,你应该能够轻松地上升到60秒左右,而不必担心。除此之外,您可能需要实现某种类型的系统来监视系统状态


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

+1了解一个好的、解释清楚的问题。您的应用程序的所有页面都需要这些信息,还是只需要其中的一部分?第一个请求是否总是到达某个特定页面,或者可能是任何页面?谢谢。只有部分页面需要此信息。考虑到关闭应用程序域,并且第一个请求强制IIS启动它,第一个请求将未经身份验证(因为我们在会话对象中保留了一些小的登录信息),因此第一个页面将是登录页面。这很有趣。但是,如果预热逻辑需要很长时间,会发生什么?在这段时间里没有人回答请求?也许保留应用程序池是一种解决方案,但是有没有办法告诉IIS让应用程序池始终处于活动状态?很难说,这类事情是基于具体情况的。我已经在MVC中使用了AsyncController,我已经有了一个表示IOCP的IAsyncResult,我想要的是告诉两个或更多的请求在没有旋转等待的情况下等待该IOCP,因为数据是公用的,我不想多次检索它。@vtortola那么您应该在MVC应用程序的内存中缓存数据,并为缓存的副本提供服务。这意味着您可能有多个IAsyncResults等待缓存只检索一次数据。这个问题实际上应该是关于慢速大数据应用程序体系结构的,而不是关于IOCP的。您不想弄乱服务器的基础,尤其是如果您可以通过常用方式完成任务的话。