/// <summary> /// 返回队列中第一个,如果队列为空,则返回 null; /// </summary> /// <returns></returns> private TMaterial PopMaterial() { if (MaterialBufferSize == 0) { return(default(TMaterial)); } var nextMaterial = MaterialBuffers[0]; MaterialBuffers.RemoveAt(0); return(nextMaterial); }
//从缓存中读取 private bool TryGetCurrentFromBuffer() { //读取缓存 TMaterial material = MaterialBuffers.Pop(); if (material == null) { log.Info(Name + "缓存数据读取结束!"); OnCompleted(); return(false); } this.Current = (material); return(true); }
/// <summary> /// 添加原料到缓存,这是一个原料入口。 /// </summary> /// <param name="nextBufferMaterial"></param> private void AppendMaterialToBuffer(TMaterial nextBufferMaterial) { OnMaterialInputted(nextBufferMaterial); MaterialBuffers.Add(nextBufferMaterial); }
/// <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()); } }