Example #1
0
 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));
 }
Example #2
0
        /// 设置在线信息
        /// <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
        }