public override bool Equals(object obj) { if (obj is AgentLive) { AgentLive b = obj as AgentLive; return(this.AgentID.Equals(b.AgentID)); } return(base.Equals(obj)); }
/// 设置在线信息 /// <summary> /// 设置在线信息 /// </summary> /// <param name="live"></param> public void SetAgentLive(AgentLive live) { ///////////////////自动转离线逻辑/////////////////////////// //厂家在线数据表会不定时的drop+create //为了防止在drop之后查询不到数据时界面显示离线的情况 //加islock_dead锁来判断数据是否是真正的转离线 //只有离线状态超过5s,才会判断是真正的离线 //逻辑: //1.转离线时,首先加锁 //2.在进入下轮查询后,如果发现还是转离线时,尝试解锁,加锁时间到达门限值,则能解锁,表示真正的离线 //3.否则可能只是数据被drop掉了而已,不进行离线 ///////////////////非自动转离线下-状态切换///////////////////////// //厂家的数据会有3,5秒延时 //为了防止手动修改状态之后,数据库还没有刷新过来时,界面数据显示旧数据的问题 //加入数据锁islock_data //逻辑: //1.如果手动修改状态,调用LockAgentLive方法加锁 //2.设置状态时,先对加锁状态的数据进行解锁 //3.解锁方式有两种:一是加锁时间到达门限值10s(防止长时间加锁造成异常) 二是传入的数据和旧的数据状态相同(表示数据库数据已被正确同步) //4.判断是否锁定,未锁定则赋值,否则等待下一轮查询,继续尝试解锁 #region 转离线时 //当AgentLive != null && live == null时,表示自动转离线 //可能是真正的离线;也可能是drop表后还没来得及create表 if (AgentLive != null && live == null) { //转离线时,先锁定 if (islock_dead == false) { Log("转离线时-锁定"); Lock(true, 2); } else { Log("转离线时-已锁定"); //达到门限值,解锁 if (IsOverTime(2)) { Log("转离线时-解锁"); Lock(false, 2); //设置离线 AgentLive = live; } } } else { //退出转离线时,解锁 Lock(false, 2); #region 状态切换 //被LockAgentLive方法锁定了 if (islock_data) { Log("状态切换-锁定"); //锁定到达最大时间,解锁 if (IsOverTime(1)) { Log("状态切换-时间解锁"); Lock(false, 1); } else //状态相等 或者 都是离线 if ((AgentLive != null && live != null && AgentLive.CurrStatus == live.CurrStatus) || (AgentLive == null && live == null)) { Log("状态切换-数据解锁"); //数据相同,解锁 Lock(false, 1); } } //解锁状态下,才能赋值 if (islock_data == false) { AgentLive = live; } #endregion } #endregion }