Exemple #1
0
        /// <summary>
        /// 返回队列中第一个,如果队列为空,则返回 null;
        /// </summary>
        /// <returns></returns>
        private TMaterial PopMaterial()
        {
            if (MaterialBufferSize == 0)
            {
                return(default(TMaterial));
            }

            var nextMaterial = MaterialBuffers[0];

            MaterialBuffers.RemoveAt(0);
            return(nextMaterial);
        }
Exemple #2
0
        //从缓存中读取
        private bool TryGetCurrentFromBuffer()
        {
            //读取缓存
            TMaterial material = MaterialBuffers.Pop();

            if (material == null)
            {
                log.Info(Name + "缓存数据读取结束!"); OnCompleted();  return(false);
            }

            this.Current = (material);
            return(true);
        }
Exemple #3
0
        /// <summary>
        /// 添加原料到缓存,这是一个原料入口。
        /// </summary>
        /// <param name="nextBufferMaterial"></param>
        private void AppendMaterialToBuffer(TMaterial nextBufferMaterial)
        {
            OnMaterialInputted(nextBufferMaterial);

            MaterialBuffers.Add(nextBufferMaterial);
        }
Exemple #4
0
        /// <summary>
        /// 移动到下一条,如要设置了缓存,则先填充缓存。
        /// </summary>
        /// <returns></returns>
        public override bool MoveNext()
        {
            if (this.DataSource.IsCancel || IsCancel)
            {
                log.Info(Name + "缓存数据流已经被取消!"); OnCompleted();  return(false);
            }

            //先获取一个原料
            TMaterial next = default(TMaterial);

            if (!IsMaterialEnded)
            {
                next = GetNextMaterial();
            }//先获取一个原料

            //如果为空,则尝试读取缓存,并直接返回结果
            if (next == null)
            {
                return(TryGetCurrentFromBuffer());
            }

            //检核是否合格,不合格则继续读取
            if (!OnMaterialCheck(next))
            {
                return(MoveNext());
            }
            else
            {
                OnAfterMaterialCheckPassed(next);
            }

            //检查缓存是否已满,若是,弹出最先进入的一个作为当前结果,并添加缓存
            if (MaterialBuffers.IsFull)
            {
                this.Current = MaterialBuffers.Pop();
                OnMaterialProducing(this.Current);
                AppendMaterialToBuffer(next);
                return(true);
            }
            else//没有满,则继续添加
            {
                AppendMaterialToBuffer(next);
                if (MaterialBuffers.IsFull)
                {
                    log.Info(Name + "缓存数据流已经填满!");
                    OnMaterialBuffersFullOrEnd(MaterialBuffers);
                }

                //直接快速填满,避免迭代过多,堆栈溢出
                for (int i = MaterialBuffers.Count; i < MaterialBuffers.WindowSize; i++)
                {
                    next = GetNextMaterial();
                    //如果为空,则尝试读取缓存,并直接返回结果
                    if (next == null)
                    {
                        return(TryGetCurrentFromBuffer());
                    }
                    //检核是否合格,不合格则继续读取
                    if (!OnMaterialCheck(next))
                    {
                        return(MoveNext());
                    }
                    else
                    {
                        OnAfterMaterialCheckPassed(next);
                    }

                    AppendMaterialToBuffer(next);
                }

                return(MoveNext());
            }
        }