【发布时间】:2011-11-28 17:17:17
【问题描述】:
我的应用程序从 Web 服务和“Application_Start”异步加载大量信息。
如果用户请求想要使用该信息,但它还没有准备好,线程将被 Monitor.Wait 阻塞。当信息准备好后,缓存对象会Monitor.Pulse所有等待的线程。这应该没问题,因为信息需要十几秒钟,并且必须将用户重定向到登录页面,发布登录信息,然后再次重定向。
问题是 Monitor.Wait 会阻塞 CLR ThreadPool 线程,据我所知,如果有大量请求到达并要求“大信息”,应用程序可能会被 CLR ThreadPool 饥饿阻塞(我有与当前的 IIS/ASP.NET 线程门控有点混乱)。
由于大量信息来自我异步调用的 Web 服务,因此我拥有该操作的 IAsyncResult。
那么,有没有办法告诉 CLR ThreadPool 线程“等待这个 IOCP”,以便线程池线程可以开始参加其他调用?
我觉得这没有很好的解释,如果不清楚我在问什么,请告诉我。
问候。
PS:虽然赏金已经结束,但如果有人知道如何做到这一点,我会提出一个新的并授予作者。
【问题讨论】:
-
+1 是一个很好且解释清楚的问题。您的应用程序的所有页面都需要此信息还是只需要其中一些信息?第一个请求总是到达特定页面还是可以是任何页面?
-
谢谢。只有一些页面需要此信息。考虑到一个关闭的应用程序域,并且第一个请求强制 IIS 启动它,第一个请求将未经身份验证(因为我们在 Session 对象中保留了一些小的登录信息),所以第一个页面将是登录页面。
标签: asp.net iis iocp iasyncresult io-completion-ports