2

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

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

问题是 Monitor.Wait 会阻塞 CLR ThreadPool 线程,据我所知,如果有大量请求到达要求“大信息”,应用程序可能会被 CLR ThreadPool 饥饿阻塞(我有点乱与当前的 IIS/ASP.NET 线程门控)。

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

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

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

问候。

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

4

2 回答 2

2

这是一个很好的问题。我的经验是,您尝试干扰 ASP.NET 内部结构的次数越多,您造成的痛苦就越多。

您是否考虑过使用serviceAutoStartProviders它来保持您的应用程序的热度?

ASP.NET 4.0:如何使用应用程序预热类

于 2011-11-28T17:35:56.127 回答
0

您应该使用IHttpAsyncHandler来返回加载缓慢的大数据。 演练:创建异步 HTTP 处理程序

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

你应该没有问题花 12 秒从IHttpAsyncHandler. 事实上,您应该能够轻松地达到大约 60 秒,而不必担心。除此之外,您可能需要实现某种类型的长轮询系统来监控系统状态。

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

于 2011-12-05T19:16:52.637 回答