
IsEnable的作用IsEnable的含义IsEnable是QueueSlot上的一个开关属性对应 DataIn/DataOut 界面中表格第一列的勾选框DataGridCheckBoxColumn Header启用。只有勾选的槽位才会参与完整的数据流——入队时写入、出队时读取。未勾选的槽位会被完全跳过就像不存在一样。这样设计允许用户在同一个 DataOut 模块里只消费部分槽位其余槽位闲置灵活控制数据流。varoutQueueSolution.Ins.QueueDic[QueueKey];// 阻塞等待模式if(IsWait){varsignalSolution.Ins.QueueSignDic[QueueKey];boolhasDatafalse;lock(outQueue){// 核心等待所有的槽完成运行foreach(varslotinQueueSlots.Where(ss.IsEnable)){if(GetSlotCount(outQueue,slot)0){hasDatatrue;break;}}}if(!hasData)signal.WaitOne(TimeOut);}lock(outQueue){foreach(varslotinQueueSlots.Where(ss.IsEnable)){intidxslot.SlotIndex;intcountGetSlotCount(outQueue,slot);if(count0){if(!IsIgnoreError){Logger.AddLog($[{ModuleParam.ModuleName}] 槽位{idx}无数据!,eMsgType.Warn);ChangeModuleRunStatus(eRunStatus.NG);returnfalse;}continue;}slot.LastValueGetSlotValue(outQueue,slot);}}AddOutputParams();ChangeModuleRunStatus(eRunStatus.OK);returntrue;这段代码实现了 DataOut出队/消费者的核心逻辑分两层阻塞等待层当用户勾选IsWait true时如需等待上游 DataIn 写入数据后立即出队先 lock 检查所有启用的槽位是否有数据。如果全部为空就调用signal.WaitOne(TimeOut)阻塞当前线程直到超时或 DataIn 写入数据后调用QueueSignDic[QueueKey].Set()将其唤醒。这是一种经典的生产者-消费者信号量模式 —— DataIn 写完后Set()DataOut 在这边WaitOne()等着。数据读取层再次 lock遍历所有槽位对每个已启用的槽位如果子队列为空且IsIgnoreError false直接报 NG 退出如果子队列为空且IsIgnoreError true跳过continue如果有数据取出最后一条赋值给slot.LastValue并据此决定是否从队列中删除IsDeleteData。