【问题标题】:SSE thread.sleep blocks other threadsSSE thread.sleep 阻塞其他线程
【发布时间】:2016-03-27 11:56:45
【问题描述】:

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

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);

}

附:我也打算使用SqlDependency,但还没有弄清楚。

编辑: 我认为问题在于会话状态。

【问题讨论】:

    标签: asp.net razor server-sent-events thread-sleep


    【解决方案1】:

    确实问题出在会话状态上,ASP.net 只允许一个活动会话线程。如果将 sessionstate 设置为 off 或 read-only,它应该被修复。据我所知,这在 razor 语法中不可用,因此我创建了一个带有 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;
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      为什么会有“return;”后 Response.Close();

      你不是忘记删除了吗?

      【讨论】:

      • 它被放置在一个while循环中,有点矫枉过正从来没有杀死任何人
      猜你喜欢
      • 1970-01-01
      • 2013-07-11
      • 1970-01-01
      • 2014-04-03
      • 2012-11-08
      • 2017-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      相关资源
      最近更新 更多