基于LRU算法的连接检测实现

/// <summary>
    /// 基于LRU算法的连接检测
    /// </summary>
    public class LRUDetect:IDisposable
    {
         
        /// <summary>
        /// 构建检测器
        /// </summary>
        /// <param name="timeout">超时时间以毫秒为单位</param>
        public LRUDetect(int timeout)
        {
            mTimeout = timeout;
            mTimer = new System.Threading.Timer(OnDetect, null, mTimeout, mTimeout);
        }       
 
        private int mTimeout;
 
        private System.Threading.Timer mTimer;
 
        private LinkedList<Node> mLinkedList = new LinkedList<Node>();
 
        /// <summary>
        /// 更新连接
        /// </summary>
        /// <param name="connection">连接信息</param>
        public void Update(IConnecton connection)
        {
            lock (this)
            {
                LinkedListNode<LRUDetect.Node> node = connection.Node;
                if (node != null)
                {
                    node.Value.LastActiveTime = Environment.TickCount;
                    mLinkedList.Remove(node);
                    mLinkedList.AddFirst(node);
                }
                else
                {
 
                    node = mLinkedList.AddFirst(new Node());
                    node.Value.LastActiveTime = Environment.TickCount;
                    node.Value.Connection = connection;
                    connection.Node = node;
                }
            }
        }
 
        /// <summary>
        /// 删除连接
        /// </summary>
        /// <param name="connection">连接信息</param>
        public void Delete(IConnecton connection)
        {
            lock (this)
            {
                LinkedListNode<LRUDetect.Node> node = connection.Node;
                if (node != null)
                {
                    node.Value.Connection = null;
                    mLinkedList.Remove(node);
                }
            }
        }
 
        private void OnDetect(object state)
        {
            lock (this)
            {
                int cutime = Environment.TickCount;
                LinkedListNode<Node> last = mLinkedList.Last;
                while (last !=null && last.Value.Detect(cutime,mTimeout))
                {
                    last.Value.Connection.TimeOut();
                    last.Value.Connection = null;
                    mLinkedList.RemoveLast();
                    last = mLinkedList.Last;
                }
            }
        }
 
        /// <summary>
        /// 连接描述接口
        /// </summary>
        public interface IConnecton
        {
            /// <summary>
            /// 获取对应在LRU算法中的节点
            /// </summary>
            LinkedListNode<LRUDetect.Node> Node
            {
                get;
                set;
            }
            /// <summary>
            /// 超时操作,当LRU算法检测到应该连接超时的时候会调用该方法
            /// </summary>
            void TimeOut();
        }
 
        /// <summary>
        /// 节点信息
        /// </summary>
        public class Node
        {
            /// <summary>
            /// 最后活动时间
            /// </summary>
            public int LastActiveTime;
            /// <summary>
            /// 相关连接信息
            /// </summary>
            public IConnecton Connection;
 
            /// <summary>
            /// 检测是否过期
            /// </summary>
            /// <param name="cutime"></param>
            /// <param name="timeout"></param>
            /// <returns></returns>
            public bool Detect(int cutime,int timeout)
            {
                return Math.Abs(cutime - LastActiveTime) > timeout;
            }
        }
 
        /// <summary>
        /// 释放对象
        /// </summary>
        public void Dispose()
        {
            if (mTimer != null)
                mTimer.Dispose();
        }
    }

 

转载于:https://www.cnblogs.com/navyblue/archive/2013/05/01/3052798.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值