62,243
社区成员




using System;
using System.Web;
/// <summary>
/// Summary description for AsnyHandler
/// </summary>
public class AsnyHandler : IHttpAsyncHandler
{
public AsnyHandler()
{
}
public IAsyncResult BeginProcessRequest(HttpContext context, AsyncCallback cb, object extraData)
{
//myAsynResult为实现了IAsyncResult接口的类,当不调用cb的回调函数时,该请求不会返回到给客户端,会一直处于连接状态
myAsynResult asyncResult = new myAsynResult(context, cb, extraData);
String content = context.Request.Params["content"];
System.Threading.Thread.Sleep(5000);
System.Data.SqlClient.SqlParameter[] p = new System.Data.SqlClient.SqlParameter[1];
p[0] = new System.Data.SqlClient.SqlParameter("@sid", System.Data.SqlDbType.VarChar, 2000);
p[0].Value = "";
System.Data.DataSet ds= dosoft.DAL.DbHelperSQL.RunProc("pr_UnitState", p);
string json=Newtonsoft.Json.JsonConvert.SerializeObject(ds.Tables[0]);
//向Message类中添加该消息
Messages.Instance().AddMessage(json, asyncResult);
return asyncResult;
}
#region 不必理会
public void EndProcessRequest(IAsyncResult result)
{
}
public bool IsReusable
{
get { return false; ; }
}
public void ProcessRequest(HttpContext context)
{
}
#endregion
}
public class myAsynResult : IAsyncResult
{
bool _IsCompleted = false;
private HttpContext context;
private AsyncCallback cb;
private object extraData;
public myAsynResult(HttpContext context, AsyncCallback cb, object extraData)
{
this.context = context;
this.cb = cb;
this.extraData = extraData;
}
private string _content;
public string Content
{
get { return _content; }
set { _content = value; }
}
#region IAsyncResult接口
public object AsyncState
{
get { return null; }
}
public System.Threading.WaitHandle AsyncWaitHandle
{
get { return null; }
}
public bool CompletedSynchronously
{
get { return false; }
}
public bool IsCompleted
{
get { return _IsCompleted; }
}
#endregion
//在Message类中的添加消息方法中,调用该方法,将消息输入到客户端,从而实现广播的功能
public void Send(object data)
{
string s = this.Content;
//context.Response.Write(this.Content);
context.Response.Write(s);
if (cb != null)
{
cb(this);
}
_IsCompleted = true; ;
}
}
using System;
using System.Collections.Generic;
using System.Web;
/// <summary>
/// Summary description for Messages
/// </summary>
public class Messages
{
//记录所有请求的客户端
List<myAsynResult> clients = new List<myAsynResult>();
#region 实现该类的单例
private static readonly Messages _Instance = new Messages();
private Messages()
{
}
public static Messages Instance()
{
return _Instance;
}
#endregion
public void AddMessage(string content, myAsynResult asyncResult)
{
//当传入的内容为"-1"时,表示为建立连接请求,即为了维持一个从客户端到服务器的连接而建立的连接
//此时将该连接保存到 List<myAsynResult> clients中,待再有消息发送过来时,该连接将会被遍历,并且会将该连接输出内容后,结束该连接
if (content == "-1")
{
clients.Add(asyncResult);
}
else
{
//将当前请求的内容输出到客户端
asyncResult.Content = content;
asyncResult.Send(null);
//否则将遍历所有已缓存的client,并将当前内容输出到客户端
foreach (myAsynResult result in clients)
{
result.Content = content;
result.Send(null);
}
//清空所有缓存
clients.Clear();
}
}
}
以上2个都是类 在app_code下
webconfig配置下
<httpHandlers>
<add path="comet_broadcast.do" type="AsnyHandler" verb="POST,GET"/>
</httpHandlers>
我现在的 也是实时的 只不过 不是图形 那个存储过程返回一个表 你也可以返回数组什么的
然后 前台如下
<script language="javascript" type="text/javascript">
$(document).ready(function () {
//加载时间
wait();
function wait()
{
$.post("comet_broadcast.do", { content: "-1" },
function (data, status)
{
data=eval(data);
for (var i=0;i<data.length;i++)
{
//以下是我的代码 你可以直接修改 然后绑定到chart上 就OK了
var id=data[i].生产单元编码;
var name=data[i].生产单元;
var state=data[i].状态;
var rid=data[i].任务号;
var jid=data[i].机床号;
var units=data[i].订货单位;
var top_id=data[i].上级生产单元编码;
var top_name=data[i].上级生产单元;
if(state=="使用")
{
$("#A"+id).css("background-color","red");
$("#A"+id).html(jid+"<br>"+units);
}
else
{
$("#A"+id).css("background-color","green");
}
}
wait();
}, "html"
);
}
});
</script>