如何创建一个使用通用处理程序发送一些实时数据的方法?

时间:2014-07-25 16:50:49

标签: c# asp.net real-time response generic-handler

我有一个页面正在等待使用此javascript代码的Generic Handler的响应:

if (typeof (EventSource) !== "undefined") {
var source = new EventSource("../Handler/EventHandler.ashx");
source.onmessage = function (event) {
    alert(event.data);
   };
} 

和这个处理程序:

public void ProcessRequest(HttpContext context)
{
        context.Response.ContentType = "text/event-stream";
        context.Response.Write("data: Event handler started");
        context.Response.Flush();
        context.Response.Close();
}

现在我想要一个方法(在处理程序中),像这样通过 ashx 将一些实时数据发送到我的页面:

public void send(string data){
    //send through ashx
}

如何将此方法编写为可从其他类调用?我可以使用线程吗?

1 个答案:

答案 0 :(得分:2)

您的ProcessRequest服务器端方法永远不会结束:

public void ProcessRequest(HttpContext context)
{
    Response.ContentType = "text/event-stream";

    var source = new SomeEventSource();
    source.OnSomeEvent += data =>
    {
        context.Response.Write(data);
        context.Response.Flush();
    }

    while (true)
    {
        System.Threading.Thread.Sleep(1000);
    }

    Response.Close();
}

这就是说,在ProcessRequest方法中使用永久阻塞循环在资源消耗方面会很糟糕。您绝对应该考虑使用IHttpAsyncHander而不是IHttpHandler。这将允许您在等待来自外部源的通知时释放工作线程。