长轮询网络服务

时间:2010-09-28 12:49:58

标签: c# asp.net

我有一个网页,每1秒后通过webservice的jQuery json数据询问。如果没有数据,则webservice返回null。

问题是,如果客户端在24小时内在网站上,那么浏览器将收集太多数据并将崩溃。所以我决定在jQuery ajax中将超时设置为60000所以它会等待数据,而在服务器端我试图像这样:

while(true)
{
  if(thereIsData){
     System.Web.Script.Serialization.JavaScriptSerializer oSerializer =
     new System.Web.Script.Serialization.JavaScriptSerializer();
     string sJSON = oSerializer.Serialize(ActionList);
     Context.Response.Output.Write(sJSON);
     return;
  }
 Thread.Sleep(1000);
}

但是如果我使用Thread.Sleep那么它将锁定整个页面。我试过线程EventWaitHandle和相同的结果整个页面被锁定,直到有数据。我也尝试过创建其他web服务但结果相同。我有什么方法可以做到这一点吗?

2 个答案:

答案 0 :(得分:0)

为什么不直接计算它请求数据的次数,例如,当它请求超过1000个项目时,然后在该点之后返回null。

或者让代码进行webservice调用以执行类似操作,并且在停止尝试之前只调用它最多次。

答案 1 :(得分:0)

这听起来像应用程序的“聊天”。处理此问题的算法之一是逐步进行轮询的“滑动比例”,例如:

1)如果在n分钟内没有更新,则将轮询率提高到3秒 2)如果没有另外n分钟的更新,则将轮询率提高到5秒,然后是10等 3)当你“有活动(非空返回值)时,将其向下滑回1秒轮询并重复步骤1和2 ......