2015-12-21 90 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; 
     } 
    } 
}