2015-12-21 51 views
0

以下简化代码(C#)是SSE的服务器端。当我使用Thread.Sleep()代替Response.Write("retry:10000\n\n")其他ajax请求时,请保持挂起。我如何创建一个合适的SSE事件流?SSE thread.sleep块其他线程

Response.ContentType = "text/event-stream"; 
DateTime echo; 

while (true) 
{ 
    var db = Database.Open("SSE"); 
    echo = db.QueryValue("select last_change from table"); 
    db.Close(); 
    Response.Write(string.Format("data:{1}\n\n", echo.GetHashCode())); 

    ///// debug this works 
    Response.Write("retry:10000\n\n"); 
    Response.Flush(); 
    Response.Close(); 
    return; 
    /////////// this doesn't work 

    Response.Flush(); 
    if (Response.IsClientConnected == false) 
    { 
     break; 
    } 
    System.Threading.Thread.Sleep(10000); 

} 

P.S.我也计划使用SqlDependency,但还没有弄清楚。

编辑: 我想问题在于sessionstate。

回答

0

为什么你有“回报”;之后 Response.Close();

你忘了删除它吗?

+0

它被放置在一个while循环中,并且有点矫枉过正从未杀死任何人 – Bert

0

确实问题出在sessionstate上,ASP.net只允许一个活动会话线程。如果您将sessionstate设置为关闭或只读,则应该修复它。就我所知,这在剃刀语法上是不可用的,因此我使用IReadOnlySessionState创建了一个.ashx。

public class SSE : IHttpHandler, IReadOnlySessionState 
    { 

public class SSE : IHttpHandler, IReadOnlySessionState 
{ 

    public void ProcessRequest(HttpContext context) 
    { 

     context.Response.ContentType = "text/event-stream"; 
     DateTime echo; 
     while (true) 
     { 
      var db = Database.Open("SSE"); 
      echo = db.QueryValue("select last_change from table"); 
      db.Close(); 
      context.Response.Write(string.Format("data:{0}\n\n", echo.GetHashCode())); 
      context.Response.Flush(); 
      if (context.Response.IsClientConnected == false) 
      { 
       break; 
      } 
      System.Threading.Thread.Sleep(10000); 

     } 

    } 

    public bool IsReusable 
    { 
     get 
     { 
      return false; 
     } 
    } 
}