基于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();
        }
    }

 

posted @ 2013-05-01 09:58  牛德彪  阅读(266)  评论(0编辑  收藏  举报