我有一个页面正在等待使用此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
}
如何将此方法编写为可从其他类调用?我可以使用线程吗?
答案 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
。这将允许您在等待来自外部源的通知时释放工作线程。