1

任务:我正在使用静态类,所以每个人都共享已经加载的数据。如果有人进行更改,该请求会将一个项目放入具有增量 ID 的列表中,我的想法是每个客户端在客户端都有它的版本,并请求是否有任何更改。

我的解决方案:为此,我使用超时为 5000 毫秒的 $.post 并发送客户端版本,在服务器端我有一个 500 循环的循环,它检查是否有更新的东西并中断循环,返回更改并有 10 毫秒Thread.Sleep 在每个周期中,这样它就不会占用 CPU。如果在客户端超时,出现错误,我再次调用帖子,如果成功我处理返回数据,而不是再次调用帖子。这样,我总是应该几乎立即获得更改,而无需大量请求,如果出现故障,我只需要等待 5 秒即可恢复。

我的问题是,当这个循环运行时,其他请求没有得到处理。使用 asp.net 开发服务器,没关系,因为它是单线程的。但win7hp iis7.5也是如此。

我尝试了什么:在注册表中设置它(HKLM\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\MaxConcurrentRequestsPerCPU),增加应用程序池的工作线程,使用 maxConcurrentRequestsPerCPU="12" maxConcurrentThreadsPerCPU= 更新 aspnet.config 文件“0” requestQueueLimit="5000" 设置,我还读到我的win7hp应该能够使用3个线程。我还认为这是一种优化,我在一个请求中使用相同的变量,因此它将其他变量排队,所以我评论了这些行,只留下了睡眠的 for 循环,但结果相同。

4

1 回答 1

1

不要在 ASP.Net 中处理请求的线程上使用 Thread.Sleep。这基本上会消耗线程并阻止启动更多请求。ASP.Net 为处理您尝试更改的请求而创建的线程数存在限制,但是线程数过多会使进程的响应速度降低,并且很容易导致 32 位进程的 OutOfMemeoryException - 所以这不是一个好方法。

还有其他几个线程在讨论用 ASP.Net 实现长轮询请求,就像这样 - ASP.NET MVC 的 AsyncController 可以用于服务大量并发挂起请求(长轮询)吗?显然彗星这样的问题 - ASP.NET 的彗星实现?.

于 2012-07-05T08:00:42.907 回答