码迷,mamicode.com
首页 > Windows程序 > 详细

c# socket 框架学习 SocketAsyncEventArgsPool 封装

时间:2015-03-03 20:24:45      阅读:374      评论:0      收藏:0      [点我收藏+]

标签:

    public class SocketAsyncEventArgsPool{
        //已使用记录
        private List<Int32> usedRecord;
        //未使用记录
        private List<Int32> unUsedRecord;
        //池子
        private List<SocketAsyncEventArgsMetadata> pool;
        //池子最大容量
        private int capacity;
        //是否动态扩展容量
       // private bool dynamic = false;

        /**池子初始化*/
        private void init() {
            this.pool = new List<SocketAsyncEventArgsMetadata>(this.capacity);
            this.usedRecord = new List<Int32>(this.capacity);
            this.unUsedRecord = new List<Int32>(this.capacity);
            for (int i = 0; i < this.capacity; i++) {
                this.unUsedRecord.Add(i);
                this.pool.Add(SocketAsyncEventArgsMetadata.valueOf(i));
            }
        }

        ///////////////////公开方法////////////////////////
        /**获取可使用数量**/
        public int GetUsedCount()
        {
            return this.capacity - this.usedRecord.Count;
        }
        /**获取可使用 SocketAsyncEventArgs */
        public SocketAsyncEventArgsMetadata Pop()
        {
            int index = 0;
            lock(this){
                if (GetUsedCount() <= 0)
                {
                    extCapacity();
                }
                index = this.unUsedRecord[0];
                this.unUsedRecord.RemoveAt(0);
                this.usedRecord.Add(index);
                return this.pool[index];
            }
        }
        /**回收 SocketAsyncEventArgs */
        public void Push(SocketAsyncEventArgsMetadata args)
        {
            int index = 0;
            lock (this)
            {
                index = args.GetIndex();
                this.unUsedRecord.Add(index);
                this.usedRecord.Remove(index);                
            }
        }

        /** 扩展容量   */
        private void extCapacity()
        {
            int minNewCapacity = 200;
            int newCapacity = Math.Min(this.capacity, minNewCapacity);

            //每次以minNewCapacity倍数扩展
            if (newCapacity > minNewCapacity)
            {
                newCapacity += minNewCapacity;
            }
            else {
                //以自身双倍扩展空间
                newCapacity = 64;
                while (newCapacity < minNewCapacity)
                {
                    newCapacity <<= 1;
                }
            }


            for (int i = this.capacity; i < newCapacity; i++) {
                this.unUsedRecord.Add(i);
                this.pool.Add(SocketAsyncEventArgsMetadata.valueOf(i));
            }

            this.capacity = newCapacity;
        }


        //getter

        public int GetCapacity() {
            return this.capacity;
        }

        /**构建方法*/
        public static SocketAsyncEventArgsPool valueOf(int maxCapacity)
        {
            SocketAsyncEventArgsPool result = new SocketAsyncEventArgsPool();
            result.capacity = maxCapacity;
            result.init();
            return result;
        }
    }

 

   public class SocketAsyncEventArgsMetadata : SocketAsyncEventArgs
    {
       /**记录索引**/
       private int index;
       private SocketAsyncEventArgs args;

       public static SocketAsyncEventArgsMetadata valueOf(int index) {
           SocketAsyncEventArgsMetadata result = new SocketAsyncEventArgsMetadata();
           result.index = index;
           return result;
       }

       internal int GetIndex()
       {
           return this.index;
       }
    }

 

 

测试类:

 class TestPool
    {
        private int count = 200;
        public void test() {
            SocketAsyncEventArgsPool pool = SocketAsyncEventArgsPool.valueOf(4);

            for (int i = 0; i < count; i++) {
                Thread th = new Thread(pop);
                th.Start(pool);
            }
           
        
        }

        private void pop(object msg)
        {
            ((SocketAsyncEventArgsPool)msg).Pop();
        }

    

    }

 

c# socket 框架学习 SocketAsyncEventArgsPool 封装

标签:

原文地址:http://www.cnblogs.com/solq/p/4311659.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!