任务: 我正在使用静态类,所以每个人都共享已经加载的数据。如果有人进行了更改,该请求会将项目放入带有增量ID的列表中,我的想法是每个客户端都在客户端拥有它的版本并请求是否有任何更改。
我的解决方案:为此,我使用$ .post,超时为5000毫秒并发送客户端版本,在服务器端我有一个500循环for循环,检查是否有更新的东西并且中断循环,返回更改并在每个循环中有一个10ms的Thread.Sleep,因此它不会占用cpu。如果在客户端上它超时,有错误,我再次调用帖子,如果成功我处理返回数据,而不是再次调用帖子。这样我总是应该在没有大量请求的情况下立即获得更改,如果出现故障,我只需要等待5秒即可恢复。
我的问题是当此循环运行时,不会处理其他请求。使用asp.net开发服务器,没关系,因为它是单线程的。但是win7hp iis7.5的情况也是如此。
我尝试了什么:在注册表中设置它(HKLM \ SOFTWARE \ Microsoft \ ASP.NET \ 4.0.30319.0 \ MaxConcurrentRequestsPerCPU),增加应用程序池的工作线程,更新aspnet。配置文件与maxConcurrentRequestsPerCPU =“12”maxConcurrentThreadsPerCPU =“0”requestQueueLimit =“5000”设置,我还读到我的win7hp应该能够使用3个线程。我还认为这是一个优化,我在一个请求中使用相同的变量,因此它将其他变量排队,所以我评论了这些行,只留下了for循环的for循环,但结果相同。
答案 0 :(得分:1)
不要在处理ASP.Net中的请求的线程上使用Thread.Sleep。这将主要消耗线程并阻止更多请求启动。 ASP.Net将创建用于处理您尝试更改的请求的线程数量限制,但是大量线程会使进程响应性降低,并且很容易导致32位进程的OutOfMemeoryException - 因此它不是一个好的路径。
有几个其他线程正在讨论如何使用ASP.Net来实现长轮询请求 - Can ASP.NET MVC's AsyncController be used to service large number of concurrent hanging requests (long poll)?显然像这样的Comet问题 - Comet implementation for ASP.NET?。