C#实现生产和消费

C#实现生产和消费

public abstract class DoubleCache<T>
    {
        #region  双缓存机制
        //也可使用环形buff机制
        private ListAndLockSlim<T> lst1 = new ListAndLockSlim<T>();
        private ListAndLockSlim<T> lst2 = new ListAndLockSlim<T>();
        private bool flag = true;


        public int Count
        {
            get
            {
                var lst = Getlist();//获取当前有效队列
                try
                {
                    lst.lockSlim.EnterUpgradeableReadLock();
                    return lst.Count;
                }
                finally
                {
                    lst.lockSlim.ExitUpgradeableReadLock();
                }
            }
        }
        /// <summary>
        /// 获取当前生效队列
        /// </summary>
        /// <returns></returns>
        protected ListAndLockSlim<T> Getlist()
        {
            if (flag)
            {
                return lst1;
            }
            else
            {
                return lst2;
            }
        }
        public virtual ListAndLockSlim<T> GetChange()
        {
            var lst = Getlist();//获取当前有效队列
            flag = !flag;//翻转有效队列
            try
            {
                lst.lockSlim.EnterUpgradeableReadLock();
                return lst;
            }
            finally
            {
                lst.lockSlim.ExitUpgradeableReadLock();
            }
            //lock (lst)//防止出现正在操作过程中的问题
            //{
            //}
        }
        #endregion

        //#region 保存近X条记录
        //public List<T> LastData = new List<T>();
        //#endregion

        /// <summary>
        /// 添加到数据源
        /// </summary>
        /// <param name="item"></param>
        public void Add(T item)
        {
            var lst = Getlist();
            try
            {
                lst.lockSlim.EnterReadLock();
                lst.Add(item);
                OnAdd(item);
            }
            finally
            {
                lst.lockSlim.ExitReadLock();
            }
        }
        /// <summary>
        /// 添加后执行方法
        /// </summary>
        /// <param name="item"></param>
        protected abstract void OnAdd(T item);


        /// <summary>
        /// 切换数据源并执行DoSomething方法
        /// </summary>
        protected void SwitchAndDoSomething()
        {
            var lst = GetChange();
            //Thread.Sleep(100);//暂停100ms,防止翻转时有在等待插入
            try
            {
                lst.lockSlim.EnterUpgradeableReadLock();
                lst.lockSlim.EnterWriteLock();
                DoSomething(lst);
            }
            finally
            {
                lst.lockSlim.ExitWriteLock();
                lst.lockSlim.ExitUpgradeableReadLock();
            }
        }
        /// <summary>
        /// 
        /// </summary>
        protected abstract void DoSomething(List<T> lst);
    }

    public class ListAndLockSlim<T> : List<T>
    {
        public ReaderWriterLockSlim lockSlim = new ReaderWriterLockSlim(LockRecursionPolicy.NoRecursion);
    }

一起习!

相关推荐: C#检测代码块运行耗时多久

//监控性能需引用 System.Diagnostics //荣达2022.11.24测试代码,检测打印耗时 System.Diagnostics.Stopwatch stopwatch = new System.Diagnostics.Stopwatch()…

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容